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++)

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

被折叠的 条评论
为什么被折叠?



