• OpenCV查找和绘制轮廓:findContours和drawContours


    1  任务描述:
    绘制图中粗线矩形的2个边界,并找到其边界的中心线

    图1 原始图像

    图1 原始图像

     2.函数原型

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

    • image:图像必须是8位单通道图像,可以是灰度图像,但更常用的是二值图像,一般是经过Canny,拉普拉斯等边缘检测算子处理过的二值图像;(函数运行时,这个图像会被直接涂改,因此如果是将来还有用的图像,应该复制之后再传给该函数)
    • contours:定义为vector> contours;向量,向量内每个元素保存了一组由连续的Point点构成的点的集合的向量,每一组Point点集就是一个轮廓,有多少轮廓,向量contours就有多少元素
    • mode:轮廓提取方式
      ○ cv::RETR_EXTERNAL:只检测最外围轮廓;
      ○ cv::RETR_LIST:检测所有的轮廓,但是不建立等级关系;
      ○ cv::RETR_CCOMP:检测所有的轮廓,但所有轮廓只建立两种等级关系,外围为顶层
      ○ cv::RETR_TREE:检测所有的轮廓,所有轮廓建立一个等级树结构
    • method:轮廓的近似方法
      ○ CV_CHAIN_APPROX_NONE:保存物体边界上所有连续的轮廓点到contours向量中
      ○ CV_CHAIN_APPROX_SIMPLE:仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存到contours向量中
    1. import numpy as np
    2. import cv2
    3. img = cv2.imread('test2.jpg')
    4. # 图像预处理
    5. #将图像转换成二值图像
    6. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    7. binary = cv2.Canny(gray, 30, 120)
    8. #查找所有矩形的轮廓
    9. contours, hierarchy = cv2.findContours(binary,
    10. cv2.RETR_LIST,
    11. cv2.CHAIN_APPROX_SIMPLE)
    12. cv2.imshow('origin', img)
    13. cv2.imshow('Canny', binary)
    14. draw_img = img.copy()
    15. # 计算矩形框的四个顶点坐标
    16. rect = cv2.minAreaRect(contours[1])
    17. box = cv2.boxPoints(rect)
    18. box = np.int0(box)
    19. print(box)
    20. cv2.drawContours(draw_img, [box], 0, (0, 0, 255), 2)
    21. rect1 = cv2.minAreaRect(contours[3])
    22. box1 = cv2.boxPoints(rect1)
    23. box1 = np.int0(box1)
    24. print(box1)
    25. # 绘制轮廓
    26. cv2.drawContours(draw_img, [box1], 0, (0, 255, 0),2)
    27. box2 =(box+box1)/2
    28. box2 = np.int0(box2)
    29. print(box2)
    30. cv2.drawContours(draw_img, [box2], 0, (255,0, 0),2)
    31. cv2.imshow('origin with contours', draw_img)
    32. if cv2.waitKey(0) & 0xFF == ord('q'):
    33. cv2.destroyWindow('binary')
    34. cv2.destroyWindow('origin')
    35. cv2.destroyWindow('origin with contours')

    运行结果:

  • 相关阅读:
    弘辽科技:淘宝店铺怎么补流量单?淘宝如何快速获取流量?
    php农校通系统
    Jtti:如何设置CentOS系统以防止恶意代码的自动执行
    使用mmdetection做实例分割
    【牛客网-公司真题-前端入门篇】——奇安信秋招笔试-前端-卷2
    LLVM学习笔记(62)
    渗透基础BurpSuite2.1安装与JDK1.8和PhpStudy2018
    uwsgi配置
    pytest allure 生成报告过程
    awk:gawk,mawk,nawk的选项笔记221109
  • 原文地址:https://blog.csdn.net/qq_42982824/article/details/133377267