当前位置:   article > 正文

OpenCV之findContours获取轮廓(Python版)_opencv findcontours python

opencv findcontours python

参考:https://blog.csdn.net/loovelj/article/details/78739790

OpenCV自带寻找轮廓的函数,流程是:获取灰度图→图片二值化→寻找轮廓

直接上代码(Python版)

  1. import cv2
  2. def find_contours(imgname):
  3. img = cv2.imread(imgname)
  4. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  5. cv2.imwrite("gray.jpg", gray)
  6. _, binary = cv2.threshold(gray, 220, 255, cv2.THRESH_BINARY)
  7. cv2.imwrite("binary.jpg", binary)
  8. image, contours, hierarchy = cv2.findContours(
  9. binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
  10. )
  11. cv2.drawContours(img, contours, -1, (0, 0, 255), 3)
  12. cv2.putText(
  13. img,
  14. "{:.3f}".format(len(contours)),
  15. (30, 30),
  16. cv2.FONT_HERSHEY_SIMPLEX,
  17. 1.0,
  18. (0, 255, 0),
  19. 1,
  20. )
  21. # cv2.imshow("img", img)
  22. cv2.imwrite("contours.jpg", img)
  23. cv2.waitKey(0)
  24. if __name__ == "__main__":
  25. img = "test.jpg"
  26. find_contours(img)

函数说明:

(1)cvtColor:将彩色图转为灰度图

  1. void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );
  2. //参数解释:
  3. //InputArray src: 输入图像即要进行颜色空间变换的原图像,可以是Mat类
  4. //OutputArray dst: 输出图像即进行颜色空间变换后存储图像,也可以Mat类
  5. //int code: 转换的代码或标识,即在此确定将什么制式的图片转换成什么制式的图片
  6. //int dstCn = 0: 目标图像通道数,如果取值为0,则由src和code决定

(2)threshold:将图像二值化为黑白图片

  1. double cv::threshold(
  2. cv::InputArray src, // 输入图像
  3. cv::OutputArray dst, // 输出图像
  4. double thresh, // 阈值
  5. double maxValue, // 向上最大值
  6. int thresholdType // 阈值化操作的类型
  7. );

(3)findContours:寻找图像中物体的轮廓

  1. void cv::findContours ( InputOutputArray image,
  2. OutputArrayOfArrays contours,
  3. OutputArray hierarchy,
  4. int mode,
  5. int method,
  6. Point offset = Point()
  7. )
  8. //image:输入图像,图像必须为8-bit单通道图像,图像中的非零像素将被视为1,0像素保留其像素值,故加载图像后会自动转换为二值图像。我们同样可以使用
  9. //contours:检测到的轮廓,每个轮廓都是以点向量的形式进行存储即使用point类型的vector表示
  10. //hierarchy:可选的输出向量(std::vector),包含了图像的拓扑信息,作为轮廓数量的表示hierarchy包含了很多元素,每个轮廓contours[i]对应hierarchy中hierarchy[i][0]~hierarchy[i][3],分别表示后一个轮廓,前一个轮廓,父轮廓,内嵌轮廓的索引,如果没有对应项,则相应的hierarchy[i]设置为负数。
  11. //mode轮廓检索模式,可以通过cv::RetrievalModes()查看详细信息

(4)drawContours():

  1. void cv::drawContours ( InputOutputArray image,
  2. InputArrayOfArrays contours,
  3. int contourIdx,
  4. const Scalar & color,
  5. int thickness = 1,
  6. int lineType = LINE_8,
  7. InputArray hierarchy = noArray(),
  8. int maxLevel = INT_MAX,
  9. Point offset = Point()
  10. )
  11. //image:输入输出图像,Mat类型即可
  12. //contours:使用findContours检测到的轮廓数据,每个轮廓以点向量的形式存储,point类型的vector
  13. //contourIdx:绘制轮廓的只是变量,如果为负值则绘制所有输入轮廓
  14. //color:轮廓颜色
  15. //thickness:绘制轮廓所用线条粗细度,如果值为负值,则在轮廓内部绘制
  16. //lineTpye:线条类型,有默认值LINE_8

运行后得到原图、灰度图、二值化图、轮廓图分别如下

原图

灰度图

二值化

轮廓图

 

 
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/141147
推荐阅读
相关标签
  

闽ICP备14008679号