본문 바로가기

Programming/Python

[파이썬 에러] cv2.error: opencv(4.5.2) :-1: error: (-5:bad argument) in function 'circle' > overload resolution failed: > - layout of the output array img is incompatible with cv::mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels) > -..

반응형

python에서 좌표 몇개를 cv2 라이브러리를 이용해서 간단히 plotting 하려고 했으나 다음과 같은 에러가 발생했다.

 

cv2.error: opencv(4.5.2) :-1: error: (-5:bad argument) in function 'circle' > overload resolution failed: > - layout of the output array img is incompatible with cv::mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels) > - expected ptr for argument 'img' 

 

나 같은 경우에는 아래의 코드에서 문제가 발생했다.

# setting image
display = images[batch_i][view_i] # 특정 batch에서의 특정 view 에서의 2d image
display = display.permute(1,2,0) # [3,H,W] -> [H,W,3]
display = display.detach().cpu().numpy()
display = denormalize_image(display).astype(np.uint8)

# plotting GT
joint2d_gt = project(proj_matricies[batch_i][view_i].cpu().numpy(), joint3d_gt)
joint2d_gt *= 1000. / math.sqrt(display.shape[0] * display.shape[1])
for i, (x, y) in enumerate(joint2d_gt):
	cv2.circle(display, (int(x), int(y)), 2, (0, 0, 255), -1)

이 중에서 가장 아래의 cv2.circle() 이라는 함수를 수행하지 못해서 발생하는 에러였는데 이 문제의 구체적인 원인은 모르겠으나 간단히 해결하는 방법이 있다.

 

그건 바로 이미지가 .copy() 함수를 거치도록 하는것이다.

 

따라서 윗줄의 코드를 아래줄처럼 고친다.

# error code
display = denormalize_image(display).astype(np.uint8)

# fixed code
display = denormalize_image(display).astype(np.uint8).copy()

 

반응형