1

由于 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 转换可以做到这一点,但它令人深感不安

4

0 回答 0