0 前言
本篇博客主要是总结OpenCV使用过程中遇到的一些问题,以及对应的解决办法,这里重点是关注OpenCV,既有基于C++的,也有基于Python的,比较全面,而且也会随着我的学习经历不断更新。
OpenCV环境配置相关:
1 中文乱码问题
OpenCV对中文的支持很不好,比如显示图片的窗口名不能是中文,否则会出现乱码;同样,读取和保存的图片路径中也不能包含中文,否则会报错。
不过貌似基于VS配置的OpenCV能够解决这个问题,可能是因为使用的编译器不一样的缘故,VSCode配置OpenCV一般使用的是MinGW这一套编译器,而VS配置的使用的是微软的MSVC编译器。
出现乱码是因为VS默认的编码方式为GBK/GB2312,而OpenCV需要的编码方式为UTF-8,而且注意是“with BOM”版本,否则对于OpenCV代码会报错
“c2001 常量中有换行符”
。
但每次手动更改文件的编码方式有点麻烦,这里推荐安装一个插件:
对于python中的OpenCV,一开始以为编码方式会比较兼容,但是很遗憾,在python-opencv中,窗口名设置为中文仍然会乱码。
2 非法路径问题
读取和保存图片不能有中文这是一个经典问题了,但是没想到的是,OpenCV对于非法路径似乎处理得不够好。
之前无意间遇到一个问题,那就是
在python中使用opencv保存图片老是不执行,也不报错
。但是换一个一般的文件名又能够保存,后来经过测试发现应该是文件路径的问题,不是有中文,而是有冒号。通过查找资料才知道,Windows中文件路径不能包含冒号,因为冒号有其他的含义。记录一下,这种问题确实有点少见。
3 图片索引与分片
在对图片进行处理时,经常会遇到需要取图片的一部分的情况,即对图片的
索引
,但是对于不熟悉图片结构的人来说,可能会遇到一些问题,这里彻底理清楚一下。
-
首先是求图片shape
import cv2 img = cv2.imread("101249.jpg") print(img.shape)
需要注意这个输出值,其实就是输出数组的维度而已。而数组维度一般是先行后列,所以自然这个结果表示这张图
有706行,1258列,每一个元素包含三个数值,即三通道RGB
。而在图片处理中,一般
以左上角为零点,向右为x轴,向下为y轴,x轴方向称为宽度(Width),y轴方向称为高度(Height)
。所以总结来说,shape函数的格式为:
height, width, channels = img.shape
-
图片切片与索引
理解了上面求shape的操作,那么对于图片的分割也能理得更清楚。类似于一般的数组索引,按维数依次索引,从外往里,
所以在索引图片时,应该是先索引行,再索引列
。如下所示。