和OpenCV版本有关,原文见Python开发:OpenCV版本差异所引发的cv2.findContours()函数传参问题.
一、问题如下:
cv2.findContours()这个方法是用来找出轮廓值的:
# cv2.findContours找出轮廓值,cv2.RETR_EXTERNAL表示图像的外轮廓
binary, contours, h = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
但是在运行时,我所使用的opencv-python4.1.0.25则报错。错误信息:
ValueError: not enough values to unpack (expected 3, got 2)
二、问题解决:
1、降级(或升级)OpenCV:
我在python中安装的第三方库是OpenCV4.1.0.25,所以这里要降级处理:
pip3 install opencv-python==3.4.3.18.
使用pip将版本降为3.4.3.18(如果是OpenCV2则要升级到OpenCV3)
2、解析差异:
OpenCV2和OpenCV4中:
findContours这个轮廓提取函数会返回两个值:
①轮廓的点集(contours)
②各层轮廓的索引(hierarchy)
OpenCV3中:
则会返回三个值:
①处理的图像(image)
②轮廓的点集(contours)
③各层轮廓的索引(hierarchy)
三、cv2.findContours()相关参数:
①第一个参数:
寻找轮廓的图像
②第二个参数表示轮廓的检索模式,有四种:
cv2.RETR_EXTERNAL 只检测外轮廓
cv2.RETR_LIST 检测的轮廓不建立等级关系
cv2.RETR_CCOMP 建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息
cv2.RETR_TREE 建立一个等级树结构的轮廓
③第三个参数method为轮廓的近似办法:
cv2.CHAIN_APPROX_SIMPLE 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标(矩形只需四顶点)
cv2.CHAIN_APPROX_TC89_L1 使用teh-Chinl chain 近似算法
CV_CHAIN_APPROX_TC89_KCOS
cv2.CHAIN_APPROX_NONE 存储所有的轮廓点,相邻的两个点的像素位置差不超过1