赞
踩
目录
1.2 cv2.findContours、cv::findContours函数简介
2. opencv各版本cv2.findContours说明
轮廓可以简单地解释为连接所有连续点(沿边界)的曲线,具有相同的颜色或强度。轮廓是形状分析和对象检测和识别的有用工具。
·为了获得更好的准确性,请使用二值图像。所以在寻找轮廓之前,应用阈值或精确边缘检测。
·findContours 函数修改源图像。因此,如果您在找到轮廓后仍想要源图像,请将其存储到其他一些变量中。
·在 OpenCV 中,寻找轮廓就像从黑色背景中寻找白色物体。所以请记住,要找到的对象应该是白色的,背景应该是黑色的。如果有其他预处理方法,只需要把轮廓所在区域和其他区域尽可能有反差即可
功能:
在二值图像中查找轮廓。
该函数从二进制图像中检索轮廓。轮廓是形状分析和对象检测和识别的有用工具。
注意事项:
源图像由该函数修改。
此外,该函数不考虑图像的 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()
- )
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 中提取轮廓,然后应该在整个图像上下文中对其进行分析,这将很有用。
image, contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
三个参数,注意参数的顺序
contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
两个参数,注意参数的顺序
测试图片: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
程序执行效果
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。