【Emgu CV教程】10.10、PointPolygonTest()判断点是否在轮廓内部


一、函数介绍

PointPolygonTest()函数,俗称“点多边形检测”,是Emgu.CV中学习计算点到轮廓的距离,函数官方定义如下

public static double PointPolygonTest(
	IInputArray contour, // 输入轮廓
	PointF pt, // 待判断的点
	bool measureDist // 判断方式
)

measureDist 为布尔型值,表示距离的判定方式。
当值为 True 时,表示计算点到轮廓的距离。如果点在轮廓的外部,返回值为负数;如果点在轮廓上,返回值为 0;如果点在轮廓内部,返回值为正数。
当值为 False 时,不计算距离,只返回“-1”、“0”和“1”中的一个值,表示点相对于轮廓的位置关系。如果点在轮廓的外部,返回值为“-1”;如果点在轮廓上,返回值为“0”;如果点在轮廓内部,返回值为“1”。

二、演示

1.原始素材

原始素材srcMat如下图:
在这里插入图片描述
利用程序生成一个随机点,判断这个点与“口”字形最外层轮廓的关系。

2.代码

假设已经得到了前景的最外层轮廓,赋值为变量contour,利用PointPolygonTest()计算点是否在轮廓内部的代码如下:

 Random random = new Random();
 int width = tempMat.Width;
 int height = tempMat.Height;
 int x = random.Next(0, width);
 int y = random.Next(0, height);
 System.Drawing.Point p = new System.Drawing.Point(x, y);
 CvInvoke.Circle(dstMat, p, 3, new MCvScalar(0, 0, 255), -1, LineType.EightConnected, 0); // thickness是-1,代表实心圆

 // 判断点是否在轮廓内部
double distance = CvInvoke.PointPolygonTest(contours[key], p, true);
if (distance >= 0)
{
    TextBlockResult.Text = "随机点" + "Point(" + x + "," + y + ")" + "在轮廓内部,距离" + Convert.ToInt32(distance) + "个像素";
}
else
{
    TextBlockResult.Text = "随机点" + "Point(" + x + "," + y + ")" + "不在轮廓内部,距离" + Convert.ToInt32(distance) + "个像素";
}

3.运行结果

在这里插入图片描述


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

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值