目录

1. findContours函数

1.1. 轮廓contours

1.2 cv2.findContours、cv::findContours函数简介

1.3 参数说明:

2. opencv各版本cv2.findContours说明

2.1  opencv3.x

2.2  opencv2.x和4.x

3  cv2.findContours使用示例:

3.1 opencv3.x版本

4. 参考链接


1. findContours函数

1.1. 轮廓contours

        轮廓可以简单地解释为连接所有连续点(沿边界)的曲线,具有相同的颜色或强度。轮廓是形状分析和对象检测和识别的有用工具。

·为了获得更好的准确性,请使用二值图像。所以在寻找轮廓之前,应用阈值或精确边缘检测。

·findContours 函数修改源图像。因此,如果您在找到轮廓后仍想要源图像,请将其存储到其他一些变量中。

·在 OpenCV 中,寻找轮廓就像从黑色背景中寻找白色物体。所以请记住,要找到的对象应该是白色的,背景应该是黑色的。如果有其他预处理方法,只需要把轮廓所在区域和其他区域尽可能有反差即可

1.2 cv2.findContours、cv::findContours函数简介

功能:

        在二值图像中查找轮廓。
        该函数从二进制图像中检索轮廓。轮廓是形状分析和对象检测和识别的有用工具。

注意事项:

        源图像由该函数修改。

        此外,该函数不考虑图像的 1 像素边界(它用 0 填充并用于算法中的邻域分析),因此接触图像边界的轮廓将被剪裁。

c++构造形式1:

void cv::findContours 	( 	InputOutputArray  	image,
		OutputArrayOfArrays  	contours,
		OutputArray  	hierarchy,
		int  	mode,
		int  	method,
		Point  	offset = Point() 
	) 	

c++构造形式2:

void cv::findContours 	( 	InputOutputArray  	image,
		OutputArrayOfArrays  	contours,
		int  	mode,
		int  	method,
		Point  	offset = Point() 
	) 	

1.3 参数说明:

image:

        源图像,8 位单通道图像。非零像素被视为 1。零像素保持为 0,因此图像被视为二进制。您可以使用 compare 、 inRange 、 threshold 、adaptiveThreshold 、 Canny 等从灰度或彩色图像中创建二值图像。该函数在提取轮廓的同时修改图像。如果 mode 等于 RETR_CCOMP 或 RETR_FLOODFILL,则输入也可以是标签的 32 位整数图像 (CV_32SC1)。

contours:

        检测到的轮廓。每个轮廓都存储为点向量。

hierarchy:

        可选的输出向量,包含有关图像拓扑的信息。它具有与轮廓数一样多的元素。对于每个第 i 个轮廓 contours[i] ,元素 hierarchy[i][0] 、 hiearchy[i][1] 、 hiearchy[i][2] 和 hiearchy[i][3] 设置为 0-基于同一层级的下一个和前一个轮廓的轮廓中的索引,分别是第一个子轮廓和父轮廓。如果轮廓 i 没有下一个、上一个、父级或嵌套轮廓,则 hierarchy[i] 的相应元素将为负数。

mode:

        轮廓检索模式,见 cv::RetrievalModes

method:

        轮廓逼近方法,见 cv::ContourApproximationModes

offset:

        每个轮廓点移动的可选偏移量。如果从图像 ROI 中提取轮廓,然后应该在整个图像上下文中对其进行分析,这将很有用。

2. opencv各版本cv2.findContours说明

2.1  opencv3.x

image, contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

        三个参数,注意参数的顺序

2.2  opencv2.x和4.x

contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

        两个参数,注意参数的顺序

3  cv2.findContours使用示例:

3.1 opencv3.x版本

测试图片:test.png,两个图片,左图会找不到轮廓导致程序报错,右图可以找到

python代码:

# -*- coding:utf-8 -*-
import numpy as np
import cv2
im = cv2.imread('test2.png') ##读入彩色图片,用于后面的显示矩形框
cv2.imshow('im', im) ##hxz
cv2.waitKey(0)##hxz
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
 
#找到最大的轮廓
area = []
for k in range(len(contours)):
    area.append(cv2.contourArea(contours[k]))
max_idx = np.argmax(np.array(area))
 
rect = cv2.minAreaRect(contours[max_idx])
points = cv2.boxPoints(rect) #得到最小外接矩形的四个点坐标
points = np.int0(points) #坐标值取整
 
image_show = cv2.drawContours(im, [points], 0, (0 ,0 , 255), 4) ##hxz 红色更明显    
 
cv2.imshow('image_show', image_show) ##hxz
cv2.waitKey(0)##hxz

程序执行效果

4. 参考链接

opencv3.2 Contours官方文档: OpenCV: Contours : Getting Started

更改下图箭头所指处可以查看其他opencv版本的内容

staclflow关于 cv2.findContours返回值报错的回答:

python - compatibility issue with contourArea in openCV 3 - Stack Overflow

cv2.findContours函数说明  OpenCV: Structural Analysis and Shape Descriptors