opencv之点多边形测试

opencv 专栏收录该内容
24 篇文章 0 订阅

在这里插入图片描述在这里插入图片描述在这里插入图片描述

//点多边型测试
int main()
{

    const int r=100;
    Mat src= Mat::zeros(r*4,r*4,CV_8UC1);
    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<vert.size();i++)
    {
		//画一个多边形
        line(src,vert[i],vert[(i+1)%6],Scalar(255),3,8,0);

    }

    vector<vector<Point>> contours;
    vector<Vec4i> hierachy;
    Mat csrc;
    src.copyTo(csrc);
	//找到轮廓
    findContours(csrc,contours,hierachy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point(0,0));
    Mat draw_dst =Mat::zeros(csrc.size(),CV_32FC1);
    for(int row=0;row<draw_dst.rows;row++)
    {
        for(int col=0;col<draw_dst.cols;col++)
        {
        				//测试点是否在多边形中
            double dist=pointPolygonTest(contours[0],Point2f(static_cast<float>(col),static_cast<float>(row)),true);
            draw_dst.at<float>(row,col)=static_cast<float>(dist);
        }
    }
    double minVal,maxVal;
    minMaxLoc(draw_dst,&minVal,&maxVal,0,0,Mat());
    Mat drawImg= Mat::zeros(src.size(),CV_8UC3);
    for(int row=0;row<drawImg.rows;row++)
    {
        for(int col=0;col<drawImg.cols;col++)
        {
            float dist=draw_dst.at<float>(row,col);
            if(dist>0)
            {

                drawImg.at<Vec3b>(row,col)[0]=(uchar)(abs(dist/maxVal)*255);
            }
            else if(dist<0) {
                drawImg.at<Vec3b>(row,col)[2]=(uchar)(abs(1.0-dist/minVal)*255);
            }
            else{
                drawImg.at<Vec3b>(row,col)[0]=(uchar)(abs(255-dist));
                drawImg.at<Vec3b>(row,col)[1]=(uchar)(abs(255-dist));
                drawImg.at<Vec3b>(row,col)[2]=(uchar)(abs(255-dist));

            }
        }
    }

    namedWindow("point_polygon",CV_WINDOW_AUTOSIZE);
    namedWindow("input",CV_WINDOW_AUTOSIZE);
    imshow("input",src);
    imshow("point_polygon",drawImg);
}


在这里插入图片描述

展开阅读全文
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值