opencv-python常规读写图片的代码是:
import cv2
image = cv2.imread('test.png', cv2.IMREAD_UNCHANGED)
cv2.imwrite('save_test.png', image)
但是cv2.imread
和cv2.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.imdecode
比cv2.imread
慢了1%左右,多次测试结果均是如此。
cv2.imencode
第一个参数是图片格式,以后缀名的方式体现,后缀名需要加点。该函数返回值有两个,第一个是bool类型的值,第二个才是图片数据。