返回:OpenCV系列文章目录(持续更新中......)
上一篇:OpenCV的图像矩(64)
下一篇:OpenCV4.9的基于距离变换和分水岭算法的图像分割(66)
Point Polygon Test(点多边形测试)是 OpenCV 库中的一个功能,用于判断一个点是否在一个多边形内部。它可以接受多种类型的多边形,例如凸多边形和非凸多边形,并且可以在 2D 或 3D 空间中使用。
Point Polygon Test 的工作原理很简单,它通过计算测试点到多边形边缘的距离,确定测试点与多边形之间的关系。如果测试点与多边形重合,则返回零。如果测试点在多边形内部,则返回正值。反之,如果测试点在多边形外部,则返回负值。
在计算机视觉和图像处理领域中,点多边形测试常用于对图像中的特定区域进行选取和分割,例如对目标物体的轮廓进行细分和拟合等。通过 Point Polygon Test,我们可以检测一个点是否在一个区域内,从而实现分割和细分等操作。
目标
在本教程中,您将学习如何:
- 使用 OpenCV 函数 cv::pointPolygonTest
C++代码
本教程代码如下所示。您也可以从这里下载
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main( void )
{
const int r = 100;
Mat src = Mat::zeros( Size( 4*r, 4*r ), CV_8U );
vector<Point2f> vert(6);
vert[0] = Point( 3*r/2, static_cast<int>(1.34*r) );
vert[1] = Point( 1*r, 2*r );
vert[2] = Point( 3*r/2, static_cast<int>(2.866*r) );
vert[3] = Point( 5*r/2, static_cast<int>(2.866*r) );
vert[4] = Point( 3*r, 2*r );
vert[5] = Point( 5*r/2, static_cast<int>(1.34*r) );
for( int i = 0; i < 6; i++ )
{
line( src, vert[i], vert[(i+1)%6], Scalar( 255 ), 3 );
}
vector<vector<Point> > contours;
findContours( src, contours, RETR_TREE, CHAIN_APPROX_SIMPLE);
Mat raw_dist( src.size(), CV_32F );
for( int i = 0; i < src.rows; i++ )
{
for( int j = 0; j < src.cols; j++ )
{
raw_dist.at<float>(i,j) = (float)pointPolygonTest( contours[0], Point2f((float)j, (float)i), true );
}
}
double minVal, maxVal;
Point maxDistPt; // inscribed circle center
minMaxLoc(raw_dist, &minVal, &maxVal, NULL, &maxDistPt);
minVal = abs(minVal);
maxVal = abs(maxVal);
Mat drawing = Mat::zeros( src.size(), CV_8UC3 );
for( int i = 0; i < src.rows; i++ )
{
for( int j = 0; j < src.cols; j++ )
{
if( raw_dist.at<float>(i,j) < 0 )
{
drawing.at<Vec3b>(i,j)[0] = (uchar)(255 - abs(raw_dist.at<float>(i,j)) * 255 / minVal);
}
else if( raw_dist.at<float>(i,j) > 0 )
{
drawing.at<Vec3b>(i,j)[2] = (uchar)(255 - raw_dist.at<float>(i,j) * 255 / maxVal);
}
else
{
drawing.at<Vec3b>(i,j)[0] = 255;
drawing.at<Vec3b>(i,j)[1] = 255;
drawing.at<Vec3b>(i,j)[2] = 255;
}
}
}
circle(drawing, maxDistPt, (int)maxVal, Scalar(255,255,255));
imshow( "Source", src );
imshow( "Distance and inscribed circle", drawing );
waitKey();
return 0;
}
结果
在这里:
参考文献:
1、《Point Polygon Test》-----Ana Huamán