首页 > 其他分享 >【Emgu CV教程】10.4、轮廓之多边形近似拟合

【Emgu CV教程】10.4、轮廓之多边形近似拟合

时间:2024-03-25 09:32:28浏览次数:34  
标签:gray 10.4 Emgu contours 拟合 new 轮廓 CV CvInvoke

文章目录


一、什么叫轮廓的多边形近似拟合

轮廓一般都是光滑的曲线,多边形近似拟合的意思就是,利用少量的点组成的折线,近似逼近原始多边形,这样可以减少轮廓的点集数量,或者说减少后续计算量。

比如原始轮廓是这样的:
在这里插入图片描述
这个轮廓可能会有几百个点组成,其实我们可以用四个点,就能近似的表示出这个轮廓来,如下图:
在这里插入图片描述
一共四个绿色的点,他们连成的直线,和原始的轮廓基本非常相似了。如果变成像下图一样的7个点,连成的折现就更像原始轮廓了,也就是说点越多,精度越高,这就是轮廓的多边形近似拟合。
在这里插入图片描述

二、轮廓的多边形近似拟合函数

public static void ApproxPolyDP(
	IInputArray curve,  // 输入的轮廓
	IOutputArray approxCurve, // 拟合后的点集
	double epsilon, // 精度,原始曲线与近似曲线之间的最大距离。
	bool closed // 是否闭合
)

函数的输出结果 IOutputArray approxCurve ,是近似拟合点的集合。

三、简单应用

1.原始素材

原始素材srcMat如下图:
在这里插入图片描述
这是一张米奇老鼠的照片,下面我们对其身体的每个部位进行拟合。

2.代码

代码如下:

Mat tempMat = srcMat.Clone();
Mat dstMat = srcMat.Clone();
Mat gray = new Mat();
int threshold = 40;
int epsilon = 20;

// 转成灰度图再二值化
CvInvoke.CvtColor(tempMat, gray, ColorConversion.Bgr2Gray);
CvInvoke.Threshold(gray, gray, threshold, 255, ThresholdType.Binary);
CvInvoke.Imshow("Gray and threshold", gray);

// 定义轮廓集合
VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
VectorOfRect hierarchy = new VectorOfRect();

CvInvoke.FindContours(gray, contours, hierarchy, RetrType.External, ChainApproxMethod.ChainApproxNone);

// 在一张黑色图中画出所有轮廓
Mat allContours = new Mat(new System.Drawing.Size(gray.Cols, gray.Rows), DepthType.Cv8U, 1);
allContours.SetTo(new MCvScalar(0, 0, 0));
CvInvoke.DrawContours(allContours, contours, -1, new MCvScalar(255, 255, 255), 1);

// 按照面积筛选,太小的轮廓不计算
Dictionary<int, double> dict = new Dictionary<int, double>();
if (contours.Size > 0)
{
    for (int i = 0; i < contours.Size; i++)
    {
        double area = CvInvoke.ContourArea(contours[i]);
        Rectangle rect = CvInvoke.BoundingRectangle(contours[i]);

        if (rect.Width > 20 && rect.Height > 20 && area < 3000000)
        {
            dict.Add(i, area);
        }
    }
}

var item = dict.OrderByDescending(v => v.Value); // v.Value就代表面积,是降序排列

// 开始拟合
foreach (var it in item)
{
    int key = it.Key;
    VectorOfPoint approxPoly = new VectorOfPoint();
    Mat approxPolyResultMat = new Mat(new System.Drawing.Size(gray.Cols, gray.Rows), DepthType.Cv8U, 3);
    CvInvoke.ApproxPolyDP(contours[key], approxPoly, epsilon, true);  // 多边形轮廓拟合
    CvInvoke.Polylines(dstMat, approxPoly, true, new MCvScalar(0, 0, 255), 1); // 画出红色的拟合多边形
}

CvInvoke.Imshow("All contours, " + dict.Count(), allContours);
CvInvoke.Imshow("Final result image, " + dstMat.Size.ToString(), dstMat);

3.运行结果

如下所示:
在这里插入图片描述
因为精度是20,也就是拟合的直线举例原始轮廓最远距离是20像素,因此拟合的精度不是很高,如果epsilon = 2,结果如下:
在这里插入图片描述
拟合精度提高了很多,进本上等于原始轮廓形状了,但是输出的拟合点集数量也增加了很多,因此在实际使用过程中,需要选择合适的epsilon精度参数。


原创不易,请勿抄袭。共同进步,相互学习。

标签:gray,10.4,Emgu,contours,拟合,new,轮廓,CV,CvInvoke
From: https://blog.csdn.net/sswss12345/article/details/136928767

相关文章

  • NCV8702MX33TCG电源管理线性稳压器芯片中文资料PDF数据手册引脚图图片价格
    产品概述:NCV8702是一款200mA低漏静止电流、低漏线性稳压器,带超低噪声特性。它的低噪音结合高电源抑制比(PSRR)使其特别适用于射频、音频或成像应用。该器件采用先进的BiCMOS工艺制造,可提供低电流耗量和卓越噪声性能的强大组合。NCV8702可稳定使用小型低值1µ电容器......
  • NCV7718CDPR2G半桥驱动器规格书PDF数据手册引脚图图片价格参数概概述
    产品概述:NCV7718是一款六角半桥驱动器,具有专为汽车和工业运动控制应用设计的保护功能。NCV7718具有独立的控制和诊断功能。该器件可在正向、反向、制动和高阻抗状态下运行。驱动器通过16位SPI接口进行控制,并且菊花链兼容规格书参数:引脚图:......
  • NCV7351D13R2G收发器芯片中文资料规格书PDF数据手册引脚图参数图片价格特性
    产品概述:NCV7351CAN收发器是控制器区域网络(CAN)协议控制器和物理总线之间的接口,可在12V和24V系统中使用。该收发器为总线提供差分发射功能,向CAN控制器提供差分接收功能。NCV7351是CAN高速收发器系列的新增产品,是NCV734xCAN独立收发器和AMIS42665、AMIS306......
  • NCV8703MX33TCG 线性稳压器芯片中文资料规格书PDF数据手册引脚图图片价格
    产品概述:NCV8703是一款低噪音、低功耗和低漏线性稳压器。该器件具有优异的噪音和PSRR规格,适用于使用射频接收器、成像传感器、音频处理器或需要外部洁净电源的任何部件的产品。NCV8703使用创新的自适应接地电流电路可确保轻负载调节下的超低接地电流。规格书参数:引脚图......
  • 计算机类主题会议推荐之——CVIDL 2024
    【IEEE出版】第五届计算机视觉、图像与深度学习国际学术会议(CVIDL2024)大会官网:www.cvidl.org大会时间:2024年4月19-21日大会地址:中国-珠海收录检索:EICompendex,ScopusISBN:979-8-3503-7382-0​大会简介第五届计算机视觉、图像与深度学习国际学术会议(CVIDL2024)定于202......
  • YOLOv9有效改进|加入CVPR2020的Bifpn。
    专栏介绍:YOLOv9改进系列|包含深度学习最新创新,助力高效涨点!!!一、论文摘要        Bifpn是RT-DETR中使用的特征提取模块。二、Bifpn模块详解 2.1模块简介       Bifpn: 重复加权双向特征金字塔网络 。本文用于替换YOLOv9中的FPN+PAN结构。三、 ......
  • 使用opnecv裁剪鼠标所选范围的图片
    使用opnecv裁剪鼠标所选范围的图片裁剪代码效果根据鼠标选择范围进行裁剪效果代码裁剪opencv实现裁剪很简单,确定左上角和右下角的坐标进行切片即可。代码importcv2#读取图片image=cv2.imread('blue_2.jpg')#定义裁剪区域的左上角和右下角坐标top_left......
  • 【漏洞复现】福建科立迅通信指挥调度平台pwd_update.php SQL注入漏洞 (CVE-2024-2621)
        免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。          ......
  • zynq Lwip学习笔记-recv_callback函数
    文章目录前言一、概述二、函数体三调用位置前言最近在学习zynq中的lwip协议族,找不到很好的记笔记的地方,所以就用csdn记录一下自己的学习过程。现在对lwip不熟悉,只是把官方的lwipechoserver例程跑了一下,能跑通就一点点的照着学了,笔记都是根据自己的理解写的,而且部......
  • 开源计算机视觉库OpenCV详解
    OpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉和机器学习软件库。OpenCV最初由Intel开发,后来支持由WillowGarage和Itseez(被Intel收购)进行的维护和更新。这个库旨在为实时的计算机视觉应用提供一个高效的、易于使用的环境,并且是用C++编写的,尽管它提供了......