目录:
- caffe与cv2图片格式转换
- str_to_cv2图片格式转换
caffe与cv2图片格式的转换
python中两种方式直接获得的图像是不一样的,主要表现在颜色通道,数据类型上,如下表。因此同时使用caffe和cv2时,需要将数据进行转换。
颜色通道 | 数据类型 | |
caffe | RGB | np.float32 |
cv2 | BGR | np.uint8 |
- caffe加载的图片转换为cv2可用的图片
- >>> import cv2,caffe
- >>> import numpy as np
- >>> img_path='test_folder/1.jpg'
- >>> img_caffe=caffe.io.load_image(img_path)
- >>> img_caffe.dtype
- dtype('float32')
- >>> img_caffe*=255
- >>> img_caffe_cvt=img_caffe.astype('uint8')
- >>> img_caffe2cv=img_caffe_cvt[:,:,[2,1,0]] #颜色通道转换
- >>> img_caffe2cv2=cv2.cvtColor(img_caffe_cvt, cv2.COLOR_RGB2BGR) #利用opencv函数转换
- >>> img_cv=cv2.imread(img_path) #验证
- >>> img_cv.dtype
- dtype('uint8')
- >>> img_sub=img_caffe2cv-img_cv
- >>> img_sub2=img_caffe2cv2-img_cv
- >>> np.max(img_sub)
- 0
- >>> np.max(img_sub2)
- 0
- cv2加载的图片转换为caffe加载图片后的结果
- >>> import cv2,caffe
- >>> import numpy as np
- >>> img_path='test_folder/1.jpg'
- >>> img_cv=cv2.imread(img_path)
- >>> img_cv=img_cv/255.
- >>> img_cv_cvt=img_cv.astype('float32')
- >>> img_cv2caffe=cv2.cvtColor(img_cv_cvt, cv2.COLOR_BGR2RGB) #img_cv2caffe=img_cv_cvt[:,:,[2,1,0]]
- >>> img_caffe=caffe.io.load_image(img_path)
- >>> img_sub=img_caffe-img_cv2caffe
- >>> np.max(img_sub)
- 0.0
相关问题:
图片由caffe转换为cv2格式时,若进一步对该图片进行操作(如cv2.rectangle,但cv2.imwrite可用),会出现如下数据类型错误。
- TypeError: Layout of the output array img is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)
解决方法是将该数据进行复制。查阅网上其他解决方法,有说numpy版本问题,可是测试中使用的numpy已经是当时最新的,先mark下该问题。
- >>> img_rst=cv2.rectangle(img_caffe2cv, (1,2),(4,5),(0,255,0))
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- TypeError: Layout of the output array img is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)
- >>> np.__version__
- '1.14.1'
- >>> img_caffe2cv_cp=img_caffe2cv.copy()
- >>> img_rst=cv2.rectangle(img_caffe2cv_cp, (1,2),(4,5),(0,255,0))
str_to_cv2间的转换
- >>> import cv2
- >>> import numpy as np
- >>> img_path='/data1/cv_group/cv_user/huangzhongjie/data/0--11.jpg'
- >>> img_buff=open(img_path, 'rb').read()
- >>> img_np=np.asarray(bytearray(img_buff), np.uint8)
- >>> img_tocv=cv2.imdecode(img_np, cv2.IMREAD_UNCHANGED)
- >>> img_tocv.shape<span style="white-space:pre;"> </span>#bgra四通道
- (350, 512, 4)
- >>> type(img_buff)
- <type 'str'>
- >>> img_np.shape
- (241155,)<span style="white-space:pre;"> </span>
- >>> img_cv=cv2.imread(img_path, 1)<span style="white-space:pre;"> </span>#验证转换结果
- >>> img_tocvbgr=img_tocv[:,:,0:3]
- >>> img_tocvbgr.shape
- (350, 512, 3)
- >>> img_cv.shape
- (350, 512, 3)
- >>> img_sub=img_tocvbgr-img_cv
- >>> np.max(img_sub)
- 0
注意:python-opencv 版本不同时,cv2.imdecode的参数可能为:cv2.CV_LOAD_IMAGE_UNCHANGED或cv2.IMREAD_UNCHANGED