|
发表于 2017-5-8 23:09:36
|
显示全部楼层
群里面讨论了一下
参考
http://answers.opencv.org/question/1494/pointpolygontest-is-not-working-properly/
首先,了解一个函数
PointPolygonTest
测试点是否在多边形中
double cvPointPolygonTest( const CvArr* contour, CvPoint2D32f pt, int measure_dist );
contour 输入轮廓.
pt 针对轮廓需要测试的点。
measure_dist 如果非0,函数将估算点到轮廓最近边的距离。
函数cvPointPolygonTest 决定测试点是否在轮廓内,轮廓外,还是轮廓的边上(或者共边的交点上),它的返回值是正负零,相对应的,当measure_dist=0时,返回值是1, -1,0, 同样当 measure_dist≠0 ,它是返回一个从点到最近的边的带符号距离。
然后,转变一个思路。所谓最大内切圆,就是在轮廓中找一中心点,是的轮廓上所有的点到这个中心的距离 在所有可能中最大。
那么,然后就是一个简单遍历的问题。当然,如果如贾所说,首先控制搜索空间,会提高速度。
- cv::MatcontourImg=imread("contour.png");
- std::vector<cv::Mat>channels;
- cv::split(contourImg,channels);// On these lines, the input image is paddedcv::Matgray(contourImg.rows+20,contourImg.cols+20,CV_8UC1);
- gray=255;
- channels[0].copyTo(gray(cv::Rect(10,10,contourImg.cols,contourImg.rows)));
- cv::imshow("Original",gray);
- std::vector<std::vector<cv::Point>>contours;
- cv::findContours(gray,contours,CV_RETR_LIST,CV_CHAIN_APPROX_NONE);
- cv::Matdrawing(gray.size(),CV_8UC3);
- cv::Matdraw2=drawing.clone();
- cv::drawContours(drawing,contours,0,cv::Scalar(20,175,20),1,CV_AA);
- doubledist,maxdist=-1;
- cv::Pointcenter;
- for(inti=0;i<contourImg.cols;i++)
- {for(intj=0;j<contourImg.rows;j++){dist=pointPolygonTest(contours[0],cv::Point(i,j),true);
- if(dist>maxdist)
- {maxdist=dist;center=cv::Point(i,j);}}}cv::circle(drawing,center,maxdist,cv::Scalar(220,75,20),1,CV_AA);cv::imshow("Contours",drawing);cv::waitKey();return0;
复制代码
|
|