您当前的位置: 首页 >  opencv

txwtech

暂无认证

  • 0浏览

    0关注

    813博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

OpenCV25-判断一个点是否在多边形的内部_点多边形测试pointPolygonTest

txwtech 发布时间:2021-04-26 22:57:25 ,浏览量:0

/*OpenCV25-判断一个点是否在多边形的内部_点多边形测试pointPolygonTest opencv函数 by txwtech

pointPolygonTest:

C++: double pointPolygonTest(InputArray contour, Point2f pt, bool measureDist)

用于测试一个点是否在多边形中 当measureDist设置为true时,返回实际距离值。若返回值为正,表示点在多边形内部,返回值为负,表示在多边形外部,返回值为0,表示在多边形上。 当measureDist设置为false时,返回 -1、0、1三个固定值。若返回值为+1,表示点在多边形内部,返回值为-1,表示在多边形外部,返回值为0,表示在多边形上

pointPolygonTest( InputArray  contour,// 输入的轮廓 Point2f  pt, // 测试点 bool  measureDist // 是否返回距离值,如果是false,1表示在内面,0表示在边界上,-1表示在外部,true返回实际距离 )

返回数据是double类型

步骤:

发现轮廓 对图像中所有像素点做点 多边形测试,得到距离,归一化后显示。

OpenCV Error: Assertion failed ((unsigned)(i1 * DataType::channels) < (unsigned)(size.p[1] * channels())) in cv::Mat::at, file d:\opencv3\opencv\build\include\opencv2\core\mat.inl.hpp, line 918 表示操作通道数错误,本来是单通道,却操作了多通道。 //Mat drawImg1 = Mat::zeros(src.size(),CV_8UC1);//错误 Mat drawImg1 = Mat::zeros(src.size(), CV_8UC3); */

/*OpenCV25-判断一个点是否在多边形的内部_点多边形测试pointPolygonTest
opencv函数
by txwtech

pointPolygonTest:

C++: double pointPolygonTest(InputArray contour, Point2f pt, bool measureDist)

用于测试一个点是否在多边形中
当measureDist设置为true时,返回实际距离值。若返回值为正,表示点在多边形内部,返回值为负,表示在多边形外部,返回值为0,表示在多边形上。
当measureDist设置为false时,返回 -1、0、1三个固定值。若返回值为+1,表示点在多边形内部,返回值为-1,表示在多边形外部,返回值为0,表示在多边形上

pointPolygonTest(
InputArray  contour,// 输入的轮廓
Point2f  pt, // 测试点
bool  measureDist // 是否返回距离值,如果是false,1表示在内面,0表示在边界上,-1表示在外部,true返回实际距离
)

返回数据是double类型

步骤:

发现轮廓
对图像中所有像素点做点 多边形测试,得到距离,归一化后显示。


OpenCV Error: Assertion failed ((unsigned)(i1 * DataType::channels) < (unsigned)(size.p[1] * channels())) in cv::Mat::at, file d:\opencv3\opencv\build\include\opencv2\core\mat.inl.hpp, line 918
表示操作通道数错误,本来是单通道,却操作了多通道。
//Mat drawImg1 = Mat::zeros(src.size(),CV_8UC1);//错误
Mat drawImg1 = Mat::zeros(src.size(), CV_8UC3);
*/
#include 
#include 


using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{
	Mat src = imread("e:\\pictures\\五角星.jpg");
	//Mat src = imread("e:\\pictures\\牡丹花.jpg",CV_LOAD_IMAGE_COLOR);
	
	if (!src.data)
	{
		printf("failed to load image");
		return -1;
	}
	//namedWindow("原图",CV_WINDOW_AUTOSIZE);
	imshow("原图",src);
	
	threshold(src,src,126,255,CV_THRESH_BINARY);//二值化
	//转灰度图像
	cvtColor(src,src,CV_BGR2GRAY);
	vector contours;
	vector hierachy;
	//发现轮廓
	findContours(src,contours,hierachy,RETR_TREE,CV_CHAIN_APPROX_SIMPLE,Point(0,0));
	//画轮廓
	drawContours(src,contours,1,Scalar::all(255),2,8,hierachy);

	imshow("轮廓",src);

	//waitKey();
	//return 0;

	//距离
	Mat dist = Mat::zeros(src.size(),CV_32FC1);
	for (int i = 0; i < src.rows; i++)
	{
		for (int j = 0; j < src.cols; j++)
		{
			//检测距离
			double distance = pointPolygonTest(contours[1], Point2f(j, i), true);
			dist.at(i, j) = static_cast(distance);
		}
	}

	double minVal, maxVal;
	minMaxLoc(dist,&minVal,&maxVal,0,0,Mat());
	//Mat drawImg1 = Mat::zeros(src.size(),CV_8UC1);//错误
	Mat drawImg1 = Mat::zeros(src.size(), CV_8UC3);
	int thredVal1 = 1;
	for (int i = 0; i < src.rows; i++)
	{
		for (int j = 0; j < src.cols; j++)
		{
			double distance = dist.at(i,j);
			if (distance > thredVal1)
			{
				drawImg1.at(i, j)[0] = (uchar)(abs(distance/maxVal)*255);

			}
			else if (distance < (thredVal1*(-1)))
			{
				drawImg1.at(i, j)[2] = (uchar)(abs(distance/minVal)*255);
			}
			else
			{
				drawImg1.at(i, j)[0]=(uchar)(abs(255 - distance));
				drawImg1.at(i, j)[1]=(uchar)(abs(255 - distance));
				drawImg1.at(i, j)[2]=(uchar)(abs(255 - distance));
			}
			
		}
	}
	imshow("drawImag1",drawImg1);
	//imwrite("drawImg1.jpg",drawImg1);//保存图像

	//归一化
	normalize(dist,dist,-255,255,NORM_MINMAX);
	Mat drawImg2 = Mat::zeros(src.size(),CV_8UC3);
	int thredVal2 = 3;
	for (int i = 0; i < src.rows; i++)
	{
		for (int j = 0; j < src.cols; j++)
		{
			double distance = dist.at(i,j);
			if (distance > thredVal2)
			{
				drawImg2.at(i, j)[0] = (uchar)(distance);
			}
			else if (distance < (thredVal2*(-1)))
			{
				drawImg2.at(i, j)[2] = (uchar)(distance*(-1));
			}
			else
			{
				drawImg2.at(i, j)[0] = (uchar)(255);
				drawImg2.at(i, j)[1] = (uchar)(255);
				drawImg2.at(i, j)[2] = (uchar)(255);
			}
		}
	}
	imshow("drawImg2",drawImg2);
	waitKey();
	return 0;

}

 

关注
打赏
1665060526
查看更多评论
立即登录/注册

微信扫码登录

0.0397s