当前位置: 首页 > news >正文

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<vector<Point>> 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向量中
import numpy as np
import cv2img = cv2.imread('test2.jpg')# 图像预处理
#将图像转换成二值图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
binary = cv2.Canny(gray, 30, 120)
#查找所有矩形的轮廓
contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cv2.imshow('origin', img)
cv2.imshow('Canny', binary)draw_img = img.copy()
# 计算矩形框的四个顶点坐标
rect = cv2.minAreaRect(contours[1])
box = cv2.boxPoints(rect)
box = np.int0(box)
print(box)
cv2.drawContours(draw_img, [box], 0, (0, 0, 255), 2)rect1 = cv2.minAreaRect(contours[3])
box1 = cv2.boxPoints(rect1)
box1 = np.int0(box1)
print(box1)
# 绘制轮廓
cv2.drawContours(draw_img, [box1], 0, (0, 255, 0),2)box2 =(box+box1)/2
box2 = np.int0(box2)
print(box2)
cv2.drawContours(draw_img, [box2], 0, (255,0, 0),2)
cv2.imshow('origin with contours', draw_img)if cv2.waitKey(0) & 0xFF == ord('q'):cv2.destroyWindow('binary')cv2.destroyWindow('origin')cv2.destroyWindow('origin with contours')

运行结果:

http://www.lryc.cn/news/183285.html

相关文章:

  • 毕设-原创医疗预约挂号平台分享
  • PLL锁相环倍频原理
  • POJ 2886 Who Gets the Most Candies? 树状数组+二分
  • 阿里云服务器镜像系统Anolis OS龙蜥详细介绍
  • 数学建模Matlab之基础操作
  • [计算机入门] Windows附件程序介绍(工具类)
  • 队列(循环数组队列,用队列实现栈,用栈实现队列)
  • 卷积神经网络-池化层和激活层
  • API基础————包
  • 【C++】一文带你走入vector
  • 《Secure Analytics-Federated Learning and Secure Aggregation》论文阅读
  • 十三、Django之添加用户(原始方法实现)
  • Elasticsearch数据操作原理
  • gitgitHub
  • 十天学完基础数据结构-第九天(堆(Heap))
  • vertx的学习总结7之用kotlin 与vertx搞一个简单的http
  • golang学习笔记(二):链路追踪
  • git提交代码实际操作
  • TF坐标变换
  • 如何进行网络编程和套接字操作?
  • 在Spark中集成和使用Hudi
  • 力扣第226翻转二叉数 c++三种方法 +注释
  • React项目部署 - Nginx配置
  • 【Vue3】定义全局变量和全局函数
  • 【Pandas】Apply自定义行数
  • C#,数值计算——完全VEGAS编码的蒙特·卡洛计算方法与源程序
  • 纯css实现3D鼠标跟随倾斜
  • Pandas数据结构
  • systemverilog function的一点小case
  • 微服务的初步使用