OpenCV(应用) —— 目标轮廓的相关应用

这篇具有很好参考价值的文章主要介绍了OpenCV(应用) —— 目标轮廓的相关应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、目标轮廓的获取与绘制

通常,使用findContours() 函数是为了获取一张图像内目标对象的所有轮廓,并且在 OpenCV4.x 版本中,findContours() 函数的返回值发生了变化。参数列表不列举了,下面直接给出最常用的一种语法:

// python
contours, _ = cv2.findContours(label, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

// C++
vector<std::vector<cv::Point>> contours;
cv::findContours(label, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

label:输入图,最好是二值图
cv2.RETR_EXTERNAL: 只检测最外层轮廓
cv2.CHAIN_APPROX_SIMPLE:压缩水平方向、垂直方向和对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保持轮廓信息。

调试阶段,为了直观显示出轮廓,可使用drawContours()函数进行轮廓绘制

	cv::drawContours(img, contours, -1, cv::Scalar(71, 206, 255), 1);
	cv::imshow("output_contours", img);

第三个参数为要绘制的轮廓数量,负数-1则表示全部绘制
第四个参数为轮廓的颜色
第五个参数为轮廓的粗细
后面还有参数,但都采用默认值即可

此外,还可以使用 rectangle函数 来绘制矩形边框,fillPoly函数 来填充目标区域

二、轮廓的信息(面积和周长)

检测完所有最外层轮廓后,通常还需要筛选、去除掉一些不需要的轮廓。其中,轮廓的面积是一个常用的判别值,
OpenCV提供了contourArea()函数来直接计算面积:

// python
contours, _ = cv2.findContours(label, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
     area = cv2.contourArea(contour)
     if (area < 1000):
        continue

// C++
vector<std::vector<cv::Point>> contours;
cv::findContours(label, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
for (int i = 0; i < contours.size(); i++)
{
	double area = cv::contourArea(contours[i]);
	if (area > 1000)
	{
		continue;
	}
}

此外,OpenCV还提供了一个计算轮廓周长的函数arcLength(),用法和计算面积函数是一样的。但实际用处不大,毕竟轮廓的周长并不能说明什么。

三、轮廓外接形状的三种表达方式

获得目标轮廓后,有三种处理方式:1)最小外接斜矩阵。 2)最大外接正矩阵。 3)逼近多边形。 前两种是最为常用的处理方式,毕竟矩阵信息在后续处理中比较方便。

  目标轮廓的使用在图像分割项目中很常见,因为分割的标签图是一个可以完美检测目标轮廓的二值图。三种处理使用的函数和常用方式如下:

image = cv2.imread('C:/Users/train/view4_20230616130920_2.jpg')
label = cv2.imread('C:/Users/mask/view4_20230616130920_2.png',0)
contours, _ = cv2.findContours(label, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

for contour in contours:
    # 1、最小外接斜矩阵(带角度)
    # rect = cv2.minAreaRect(contour)  # 计算轮廓的最小外接矩形
    # box = cv2.boxPoints(rect)  # 获取旋转矩形的四个顶点坐标
    # box = np.int0(box)  # 将顶点坐标转换为整数
    #
    # (cx,cy), (boxW, boxH), angle = rect  # (中心点),(宽高),角度
    #
    # cv2.drawContours(image, [box], -1, (0,255,0), 2)  # 要绘制的轮廓必须是一个列表,所以是[box]
    # cv2.fillPoly(label, np.array([contour]), 255)  # 将目标轮廓区域填充为白色

    # 2、最大外接正矩阵
    x, y, width, height = cv2.boundingRect(contour)  # (左上角坐标,宽,高)
    cv2.rectangle(image, (x, y), (x + width, y + height), (0, 255, 0), 2)

    # 3、多边形
    # epsilon = 0.01 * cv2.arcLength(contour, True)  # 常用轮廓的周长(或弧长)的百分比作为 epsilon 的值
    # approx = cv2.approxPolyDP(contour, epsilon, True) # epsilon表示逼近后的多边形与原始轮廓之间的最大距离,True表示将轮廓视为闭合
    # cv2.drawContours(image, [approx], 0, (0, 255, 0), 2)


cv2.imshow("Contours", image)
cv2.imshow("Contours——mask", label)
cv2.waitKey(0)
cv2.destroyAllWindows()

  cv2.minAreaRect函数获取最小外接斜矩阵,它的返回值为:(中心点),(宽高),角度。若只需要获取矩形坐标,可使用cv2.boxPoints函数来得到矩形的四个顶点坐标。
  该函数获得返回的角度有一个应用,就是之前博客讲的仿射变换,它返回的中心点和角度可以作为仿射变换矩阵的参数:M = cv2.getRotationMatrix2D((cx, cy), angle, 1) ,这样我们可以将有角度的目标进行仿射变换旋转,让其处于水平方向。文章来源地址https://www.toymoban.com/news/detail-740810.html

到了这里,关于OpenCV(应用) —— 目标轮廓的相关应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从人工智能到机器学习到深度学习、强化学习,以及相关的算法原理、应用场景等方面对人工智能技术的研究进行全面的综述

    作者:禅与计算机程序设计艺术 2021年是一个重要的历史节点,数字化时代正在席卷全球各个角落。大数据、云计算、区块链等新兴技术带动着各行各业的变化与革命,机器学习(ML)、深度学习(DL)、强化学习(RL)等AI技术也越发成熟。随之而来的,伴随着人工智能应用的

    2024年02月07日
    浏览(77)
  • 【OpenCV实现图像:使用OpenCV进行物体轮廓排序】

    在图像处理中,经常需要进行与物体轮廓相关的操作,比如计算目标轮廓的周长、面积等。为了获取目标轮廓的信息,通常使用OpenCV的findContours函数。然而,一旦获得轮廓信息后,可能会发现轮廓的顺序是无序的,如下图左侧所示: 在这个图中,每个轮廓都被找到,但它们的

    2024年02月03日
    浏览(44)
  • OpenCV(三十三):计算轮廓面积与轮廓长度

    1.介绍轮廓面积与轮廓长度        轮廓面积(Contour Area)是指轮廓所包围的区域的总面积。通常情况下,轮廓面积的单位是像素的平方。         轮廓长度(Contour Length)又称周长(Perimeter),表示轮廓的闭合边界的长度。轮廓的边界可以看作是由一系列相邻像素点组成的

    2024年02月09日
    浏览(39)
  • OpenCV 入门教程:轮廓特征和轮廓匹配

    轮廓特征和轮廓匹配是图像处理中用于描述和比较轮廓的技术。通过提取轮廓的形状、面积、周长等特征,并进行比较和匹配,我们可以实现目标识别、形状分析等应用。在本文中,我们将以轮廓特征和轮廓匹配为中心,为你介绍使用 OpenCV 进行轮廓处理的基本步骤和实例。

    2024年02月13日
    浏览(45)
  • 16- OpenCV:轮廓的发现和轮廓绘制、凸包

    目录 一、轮廓发现 1、轮廓发现(find contour in your image) 的含义 2、相关的API 以及代码演示 二、凸包 1、凸包(Convex Hull)的含义 2、Graham扫描算法- 概念介绍 3、cv::convexHull 以及代码演示 三、轮廓周围绘制矩形和圆形框 一、轮廓发现 1、轮廓发现(find contour in your image) 的含义 轮

    2024年02月21日
    浏览(39)
  • c# opencv 找到图像的轮廓,并绘制轮廓

    原图                                                                                结果图                                                                  本意是想去除白色图像周边的几个白色小点,得到轮廓图后,其他都设置为黑色,结果是白点更明

    2024年02月13日
    浏览(89)
  • 实时目标检测:基于YOLOv3和OpenCV的摄像头应用

    随着人工智能和计算机视觉技术的不断发展,目标检测成为了智能监控、自动驾驶、机器人等领域的关键技术之一。实时目标检测更是对系统的反应速度和准确度提出了更高的要求。本文介绍使用OpenCV和YOLOv3实现实时目标检测的方法,演示如何使用OpenCV调用YOLOv3模型进行实时

    2024年02月08日
    浏览(43)
  • OpenCV-Python(21):OPenCV查找及绘制轮廓

    1.1 目标 理解什么是轮廓 学习掌握找轮廓、绘制轮廓等 学习使用cv2.findContours()、cv2.drawContours()函数的用法 1.2 什么是轮廓         在OpenCV中,轮廓是 图像中连续的边界线的曲线,具有相同的颜色或者灰度,用于表示物体的形状 。轮廓在图像处理和计算机视觉中非常重要

    2024年01月18日
    浏览(46)
  • 7.OpenCV-图像轮廓

    1.通过OpenCV的findContours可以很方便的找到图片中内容的轮廓。 2.为了提取轮廓有更高的准确率,在提取轮廓前,需要对图片进行预处理(二值+阈值),只保留感兴趣的图像。 3.通过计算轮廓面积与外接矩形或外接圆的面积,可以找到轮廓特征,进一步筛选出感兴趣的轮廓。

    2024年02月09日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包