文章目录
- 一、函数介绍
- 二、演示
- 1.原始素材
- 2.代码
- 3.运行结果
一、函数介绍
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.运行结果
原创不易,请勿抄袭。共同进步,相互学习。