需求目的:一般都是做项目时使用opencv的findcontours和drawcontours搭配使用抓取图像内感兴趣区域。
1.Contours函数轮廓点大小排序
当使用findcontours后一般返回是contours, hierarchy两个,contours内包含的是根据设定模式所返回的轮廓。
最常使用:cv2.RETR_EXTERNAL,此模式只检测外轮廓。(输入图像必须先转灰度图再转二值图,这部分的阈值处理必须做好,调整好系数,使图像达到最理想的状态)
contours的类型为列表,contours[0]存储的是轮廓的高h,contours[1]存储的是轮廓的宽w,因此可使用contours.sort(key=所需轮廓的规则,reverse=False)方法接drawcontours可对区域进行提取,其中reverse=False为升序,True为降序。
当想挑选出所有轮廓点中最小和最大值可这么写(axis是维度):
print("最小的h:",min(np.min(contours[0],axis=2)))
print("最小的w:",min(np.min(contours[1],axis=2)))
print("最大的h:",max(np.max(contours[0],axis=2)))
print("最大的w:",max(np.max(contours[1],axis=2)))
此时如果处理好了,这就是轮廓的最大外接矩形的左上角和右下角,可通过切割法对图像进行切割;
fimg = img[int(minh):int(maxh),int(minw):int(maxw)]
显示图像可发现ROI被裁减出来。
2.输出contours类型
如果各位没有明白,那么咱们一点点来,先要确定的是contours到底是什么类型的,怎么用?
print("contours:类型:", type(contours))
print("第0 个contours:", type(contours[0]))
输入上述代码,可显示contours和contours[0]的类型,知道了对应类型,就知道该使用怎样的方式去用。
3.contours数量
print("contours 数量:", len(contours))
输出contours的数量也是十分重要的技巧之一,观察图像和我们输出的轮廓数量,从而分析现阶段处理的轮廓是不是我们理想的情况。(我目前的项目是轮廓数越少越好,更容易处理图像)
4.contours的具体内容
contours本身是列表类型,因此使用下面代码即可输出
print("counters:",contours[0])
print("counters:",contours[1])
其中[0]代表高h,[1]代表宽w
5.contours轮廓点的个数
print("contours[0]点的个数:", len(contours[0]))
print("contours[1]点的个数:", len(contours[1]))
(重要*)6.循环contours点形成最小外接矩形,并绘制从而进行其他操作。
通过Opencv的几何形状函数结合轮廓点进行图形绘制。此部分放到下一篇Opencv最小外接矩形函数部分给出详细说明及代码段。
本人尚才疏学浅,如有错误,欢迎指正与问题交流!