2014-03-01 93 views
1

我只写了一个函数来获取最接近点的物体轮廓。我认为并不难,但我不知道为什么我不能在这个功能中使用sqrt。我得到的结果是很奇怪的,而不是假设的结果。OpenCV获取最近的轮廓点

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); 
} 

回答

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

因为ab被定义为int s时,结果(a-50)^2+(b-60)^2也将是int。这会使程序模糊不清,选择使用哪个std::sqrt

enter image description here

要了,你可以先丢给float调用此函数之前。就像这样:

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