opencv-python读写含中文的路径

opencv-python常规读写图片的代码是:

import cv2
image = cv2.imread('test.png', cv2.IMREAD_UNCHANGED)
cv2.imwrite('save_test.png', image)

但是cv2.imreadcv2.imwrite无法读写含中文的路径。

  • imread在读取不成功的情况下不报错,而是返回一个NoneType对象。这导致了程序虽然在imread的时候不会崩掉,但是后续处理时往往会崩,并且由于崩溃之处并非真正的原因,原因在imread这里,所以假如我们不了解imread这个特点的话,会给程序调试带来一些麻烦。
  • imwirte在保存不成功的情况下也不报错,而是返回False。如果不是在imread这里碰到了坑,顺藤摸瓜深入了解了一下imwrite,还真不知道imwrite是有返回值的,imwrite的帮助文档(help(cv2.imwrite),版本4.2.0)甚至都没有任何关于返回值的说明。这个特点虽然通常不会给程序带来崩溃,但是想一下,如果我们费了老大的劲写好程序(但是习惯性没有对cv2.imwrite的返回值做检查),晚上挂机跑图片,结果白天过来一看,因为中文路径的问题没有保存成功,那酸爽。。。

下面代码可以解决这个问题:

import cv2
image = cv2.imdecode(np.fromfile('中文图片.png'), cv2.IMREAD_UNCHANGED)
cv2.imencode('.png', image)[1].tofile('保存_中文图片.png')

我们一般比较关心读图的效率,经老夫的G4560+7200转希捷机械盘测试,这种读图方式与cv2.imread相比只是略微有一点点的效率降低。用两种方式分别对同一张图读取10000次,结果表明cv2.imdecodecv2.imread慢了1%左右,多次测试结果均是如此。
cv2.imencode第一个参数是图片格式,以后缀名的方式体现,后缀名需要加点。该函数返回值有两个,第一个是bool类型的值,第二个才是图片数据。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值