pointPolygonTest()测试一个点是否在给定的多边形内部,边缘或者外部:
当measureDist设置为true时,返回实际距离值。若返回值为正,表示点在多边形内部,返回值为负,表示在多边形外部,返回值为0,表示在多边形上。
当measureDist设置为false时,返回 -1、0、1三个固定值。若返回值为+1,表示点在多边形内部,返回值为-1,表示在多边形外部,返回值为0,表示在多边形上。
代码示例:
#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
const int r = 100;
Mat src = Mat::zeros(4 * r, 4 * r, CV_8UC1);
vector<Point2f> points(6);
points[0] = Point(1.5*r, 1.34*r);
points[1] = Point(1 * r, 2 * r);
points[2] = Point(1.5*r, 2.866*r);
points[3] = Point(2.5*r, 2.866*r);
points[4] = Point(3 * r, 2 * r);
points[5] = Point(2.5*r, 1.34*r);
for (int i = 0; i < points.size(); i++)
{
line(src, points[i], points[(i + 1) % (points.size())], Scalar(255), 2, LINE_AA);
}
imshow("src", src);
//轮廓检测
vector<vector<Point>> contours;
vector<Vec4i> hierachy;
findContours(src, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
Mat raw_dist(src.size(), CV_32FC1);
for (int i = 0; i < raw_dist.rows; i++)
{
for (int j = 0; j < raw_dist.cols; j++)
{
raw_dist.at<float>(i, j) = pointPolygonTest(contours[0], Point2f(static_cast<float>(j), static_cast<float>(i)), true);
}
}
double minVal, maxVal;
minMaxLoc(raw_dist, &minVal, &maxVal, 0, 0, Mat());
minVal = abs(minVal);
maxVal = abs(maxVal);
Mat dst=Mat::zeros(src.size(), CV_8UC3);
for (int i = 0; i < dst.rows; i++)
{
for (int j = 0; j < dst.cols; j++)
{
double dist = raw_dist.at<float>(i, j);
if (dist > 0)
{
dst.at<Vec3b>(i, j)[0] = uchar(255-(dist / maxVal) * 255);
}
else if (dist < 0)
{
dst.at<Vec3b>(i, j)[2] = uchar(255 - (abs(dist) / minVal) * 255);
}
else
{
dst.at<Vec3b>(i, j)[0] = 255;
dst.at<Vec3b>(i, j)[1] = 255;
dst.at<Vec3b>(i, j)[2] = 255;
}
}
}
imshow("dst", dst);
waitKey(0);
}
效果如下: