23-凸包ConvexHull(EmguCV学习)

本文详细介绍了使用OpenCV进行凸包检测和缺陷分析的方法,包括二维点集的凸包计算、轮廓凸包绘制、缺陷检测及凸性缺陷分析,适用于手势识别等应用场景。

1、说明

1、CvInvoke.ConvexHull()函数: 寻找二维点集的凸包;
hull : VectorOfPoint类型或者VectorOfInt类型(返回凸包的点或凸包点的索引);
points : 二维点集:VectorOfPoint类型
在这里插入图片描述2、ConvexHull()函数与DrawContours()函数配合,可以用来检测物体是否存在缺陷(应用);
3、convexityDefects()函数说明:计算轮廓的凸性缺陷,可以用来做手势识别

contour : 单个轮廓,数据类型: VectorOfPoint
convexHull : 凸包索引或指针,C#中只能为索引,VectorOfInt 类型(ConvexHull()函数计算出来的)
convexityDefects :  输出结果,凸性缺陷检测结果,个人觉得应该是vector<Vec4i>类型,EmguCV中可以
使用VectorOfVectorOfInt 类或Mat 类或 VectorOfRect 类来存储该结果;依次存储起始点索引、结束点索引、
最远点索引、以及最远点到凸包的距离(像素单位):必须除去256(具有8个小数位),以得到正确的距离值。

OpenCV说明:

在这里插入图片描述在这里插入图片描述
EmguCV中说明:
在这里插入图片描述

2、 二维点集的凸包

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Emgu.CV;
using Emgu.Util;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
using Emgu.CV.Util;
using System.Drawing;
namespace lesson23
{
   
   
    class Program
    {
   
   
        static void Main(string[] args)
        {
   
   
            ///点集的凸包
            //Mat src = Mat.Zeros(500, 500, DepthType.Cv8U, 3);  //创建黑色图像

            Mat src = new Mat(500, 500, DepthType.Cv8U, 3);
            src.SetTo(new MCvScalar(0));


            Random random = new Random();
            VectorOfPoint vPoints1 = new VectorOfPoint(); //存储随机点
            VectorOfPoint hull = new VectorOfPoint();  //存储凸包点

            while (true)
            {
   
   
                hull.Clear(); //清除上一次数据
                src.SetTo(new MCvScalar(0));
                int count = random.Next(3, 60);
                for (int i = 0; i < count;i++)  //创建随机点集
                {
   
   
                    Point[] pt = new Point[1];
                    pt[0].X = random.Next(src.Cols / 5, src.Cols * 4 / 5);
                    pt[0].Y = random.Next(src.Rows / 5, src.Rows * 4 / 5);
                    //在源图像上显示随机点集
                    CvInvoke.Circle(src, pt[0], 3, 
                        new MCvScalar(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255)),-1);
                    vPoints1.Push(pt);
                }
                CvInvoke.Imshow("src", src);
                CvInvoke.ConvexHull(vPoints1, hull, false, true);
                for(int i = 0; i < hull.Size;i++)       
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值