由于 PIL 与 cv2 加载图像的方式不同,我经常处理 rgb->bgr 问题。通常我可以做
orig = orig[...,::-1]
但我遇到了一个奇怪的小问题(我使用的是 cv2 3.2);稍后将一些框添加到图像命中的函数
TypeError: Layout of the output array img is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)
除了有效的方法之外,所有方法的各种方法都得到了评论,显示。rgb->bgr 之后的图像看起来很好,有正确的暗淡。deepcopy 是由于偏执狂认为问题是由 image_np 的某些更改引起的。
image_np = load_image_into_numpy_array(image)
bgr_img = copy.deepcopy(image_np)
print('origshape {}'.format(bgr_img.shape))
#bgr_img = bgr_img[...,::-1] #fails
#bgr_img = bgr_img[...,[2,1,0]]) #fails
#bgr_img = np.array(bgr_img[...,[2,1,0]]) #fails
bgr_img = cv2.cvtColor(bgr_img,cv2.COLOR_RGB2BGR) #works
cv2.imshow('bgr',bgr_img)
cv2.waitKey(0)
print('finalshape {}'.format(bgr_img.shape))
...
失败的功能是
def bb_with_text(img_arr,bb_xywh,text,boxcolor=[50,255,50]):
text_color=[0,50,255]
text_bgnd_color=[220,255,180]
cv2.rectangle(img_arr,(bb_xywh[0],bb_xywh[1]),(bb_xywh[0]+bb_xywh[2],bb_xywh[1]+bb_xywh[3]),color=boxcolor,thickness=2)
img_arr[bb_xywh[1]:bb_xywh[1]+20,bb_xywh[0]:bb_xywh[0]+ bb_xywh[2]]=img_arr[bb_xywh[1]:bb_xywh[1]+20,bb_xywh[0]:bb_xywh[0]+bb_xywh[2]]/2)+np.array(text_bgnd_color)/2
cv2.putText(img_arr,text,(bb_xywh[0]+5,bb_xywh[1]+20),cv2.FONT_HERSHEY_PLAIN, 1, text_color)
return img_arr
和
-> 2063 cv2.rectangle(img_arr,(bb_xywh[0],bb_xywh[1]),(bb_xywh[0]+bb_xywh[2],bb_xywh[1]+bb_xywh[3]),color=boxcolor,thickness=2)
2064 img_arr[bb_xywh[1]:bb_xywh[1]+20,bb_xywh[0]:bb_xywh[0]+bb_xywh[2]]=(img_arr[bb_xywh[1]:bb_xywh[1]+20,bb_xywh[0]:bb_xywh[0]+bb_xywh[2]]/2)+np.array(text_bgnd_color)/2
2065 cv2.putText(img_arr,text,(bb_xywh[0]+5,bb_xywh[1]+20),cv2.FONT_HERSHEY_PLAIN, 1, text_color)
TypeError: Layout of the output array img is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)
它不是一个炫耀者,因为 cv2 转换可以做到这一点,但它令人深感不安