OpenCV获得与点最接近的轮廓

时间:2014-03-01 23:23:54

标签: c++ opencv

我只是编写一个函数来获取最接近点的对象的轮廓。我觉得不是那么难,但我不知道为什么我不能在这个函数中使用sqrt。我得到的结果很奇怪,而不是假想的结果。

void FindContour(Mat a,Mat &image){
    Mat temp;  
    int x=0, y=0;
    int i;
    int largest=65535;
    a.copyTo(temp);  
    vector< vector<Point> > contours;  
    vector<Vec4i> hierarchy;  
    findContours(temp,contours,hierarchy,CV_RETR_CCOMP,CV_CHAIN_APPROX_NONE );  
    for (int index = 0; index >= 0; index = hierarchy[index][0]) {  
         Moments moment = moments(contours[index]);
         double area = moment.m00;  
         int  a = moment.m10/area;  
         int  b = moment.m01/area;  
          i=std::sqrt((a-50)^2+(b-60)^2);  
           if (i<largest)
           {  x=a;
              y=b; 
              largest=i;
              cout<<"x"<<x<<"y"<<y<<"i"<<i<<"/n"; 
           }

    }    
       Point2i pt(x,y); 
       circle(image,pt,20,Scalar(0,255,0),2); 
    putText(image,"object",Point(x,y+30),1,1,Scalar(0,255,0),2);
}

2 个答案:

答案 0 :(得分:2)

您可以使用cv::pointPolygonTest计算点多边形距离。

答案 1 :(得分:1)

i=std::sqrt((a-50)^2+(b-60)^2);
            ^^^^^^^^^^^^^^^^^

由于ab定义为int,因此结果(a-50)^2+(b-60)^2也将为int。这将使程序不明确地选择要使用的std::sqrt

enter image description here

要解决此问题,您可以在调用此函数之前先将其强制转换为float。像这样:

i=std::sqrt((float) ((a-50)^2+(b-60)^2));