目录
1.2 cv2.findContours、cv::findContours函数简介
2. opencv各版本cv2.findContours说明
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
转载:https://blog.csdn.net/BIT_HXZ/article/details/125875017