caffe与cv2图片格式的相互转换

目录:    

  1.     caffe与cv2图片格式转换
  2.     str_to_cv2图片格式转换


caffe与cv2图片格式的转换
    python中两种方式直接获得的图像是不一样的,主要表现在颜色通道,数据类型上,如下表。因此同时使用caffe和cv2时,需要将数据进行转换。
 颜色通道数据类型
caffeRGBnp.float32
cv2BGRnp.uint8
  • caffe加载的图片转换为cv2可用的图片
[python]  view plain  copy
  1. >>> import cv2,caffe  
  2. >>> import numpy as np  
  3. >>> img_path='test_folder/1.jpg'  
  4. >>> img_caffe=caffe.io.load_image(img_path)  
  5. >>> img_caffe.dtype  
  6. dtype('float32')  
  7. >>> img_caffe*=255  
  8. >>> img_caffe_cvt=img_caffe.astype('uint8')  
  9. >>> img_caffe2cv=img_caffe_cvt[:,:,[2,1,0]]    #颜色通道转换  
  10. >>> img_caffe2cv2=cv2.cvtColor(img_caffe_cvt, cv2.COLOR_RGB2BGR)   #利用opencv函数转换  
  11. >>> img_cv=cv2.imread(img_path)        #验证  
  12. >>> img_cv.dtype  
  13. dtype('uint8')  
  14. >>> img_sub=img_caffe2cv-img_cv  
  15. >>> img_sub2=img_caffe2cv2-img_cv  
  16. >>> np.max(img_sub)  
  17. 0  
  18. >>> np.max(img_sub2)  
  19. 0  
  • cv2加载的图片转换为caffe加载图片后的结果
[python]  view plain  copy
  1. >>> import cv2,caffe  
  2. >>> import numpy as np  
  3. >>> img_path='test_folder/1.jpg'  
  4. >>> img_cv=cv2.imread(img_path)  
  5. >>> img_cv=img_cv/255.  
  6. >>> img_cv_cvt=img_cv.astype('float32')  
  7. >>> img_cv2caffe=cv2.cvtColor(img_cv_cvt, cv2.COLOR_BGR2RGB) #img_cv2caffe=img_cv_cvt[:,:,[2,1,0]]  
  8. >>> img_caffe=caffe.io.load_image(img_path)  
  9. >>> img_sub=img_caffe-img_cv2caffe  
  10. >>> np.max(img_sub)  
  11. 0.0  

相关问题:

    图片由caffe转换为cv2格式时,若进一步对该图片进行操作(如cv2.rectangle,但cv2.imwrite可用),会出现如下数据类型错误。

[plain]  view plain  copy
  1. TypeError: Layout of the output array img is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)  

    解决方法是将该数据进行复制。查阅网上其他解决方法,有说numpy版本问题,可是测试中使用的numpy已经是当时最新的,先mark下该问题。

[python]  view plain  copy
  1. >>> img_rst=cv2.rectangle(img_caffe2cv, (1,2),(4,5),(0,255,0))  
  2. Traceback (most recent call last):  
  3.   File "<stdin>", line 1in <module>  
  4. TypeError: Layout of the output array img is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)  
  5. >>> np.__version__  
  6. '1.14.1'  
  7. >>> img_caffe2cv_cp=img_caffe2cv.copy()  
  8. >>> img_rst=cv2.rectangle(img_caffe2cv_cp, (1,2),(4,5),(0,255,0))  
str_to_cv2间的转换
[python]  view plain  copy
  1. >>> import cv2  
  2. >>> import numpy as np  
  3. >>> img_path='/data1/cv_group/cv_user/huangzhongjie/data/0--11.jpg'  
  4. >>> img_buff=open(img_path, 'rb').read()  
  5. >>> img_np=np.asarray(bytearray(img_buff), np.uint8)  
  6. >>> img_tocv=cv2.imdecode(img_np, cv2.IMREAD_UNCHANGED)  
  7. >>> img_tocv.shape<span style="white-space:pre;">  </span>#bgra四通道  
  8. (3505124)  
  9. >>> type(img_buff)  
  10. <type 'str'>  
  11. >>> img_np.shape  
  12. (241155,)<span style="white-space:pre;">    </span>  
  13. >>> img_cv=cv2.imread(img_path, 1)<span style="white-space:pre;">  </span>#验证转换结果  
  14. >>> img_tocvbgr=img_tocv[:,:,0:3]  
  15. >>> img_tocvbgr.shape  
  16. (3505123)  
  17. >>> img_cv.shape  
  18. (3505123)  
  19. >>> img_sub=img_tocvbgr-img_cv  
  20. >>> np.max(img_sub)  
  21. 0  

注意:python-opencv 版本不同时,cv2.imdecode的参数可能为:cv2.CV_LOAD_IMAGE_UNCHANGED或cv2.IMREAD_UNCHANGED

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值