小言_互联网的博客

opencv(13):cv2.findContours、cv::findContours简要介绍及opencv各版本cv2.findContours函数说明

895人阅读  评论(0)

目录

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:


  
  1. void cv::findContours ( InputOutputArray image,
  2. OutputArrayOfArrays contours,
  3. OutputArray hierarchy,
  4. int mode,
  5. int method,
  6. Point offset = Point()
  7. )

c++构造形式2:


  
  1. void cv::findContours ( InputOutputArray image,
  2. OutputArrayOfArrays contours,
  3. int mode,
  4. int method,
  5. Point offset = Point()
  6. )

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代码:


  
  1. # -*- coding:utf-8 -*-
  2. import numpy as np
  3. import cv2
  4. im = cv2.imread( 'test2.png') ##读入彩色图片,用于后面的显示矩形框
  5. cv2.imshow( 'im', im) ##hxz
  6. cv2.waitKey( 0) ##hxz
  7. imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
  8. ret,thresh = cv2.threshold(imgray, 127, 255, 0)
  9. im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
  10. #找到最大的轮廓
  11. area = []
  12. for k in range( len(contours)):
  13. area.append(cv2.contourArea(contours[k]))
  14. max_idx = np.argmax(np.array(area))
  15. rect = cv2.minAreaRect(contours[max_idx])
  16. points = cv2.boxPoints(rect) #得到最小外接矩形的四个点坐标
  17. points = np.int0(points) #坐标值取整
  18. image_show = cv2.drawContours(im, [points], 0, ( 0 , 0 , 255), 4) ##hxz 红色更明显
  19. cv2.imshow( 'image_show', image_show) ##hxz
  20. 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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场