我只是编写一个函数来获取最接近点的对象的轮廓。我认为这并不难,但是我不知道为什么不能在此函数中使用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);
}

最佳答案

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

因为ab被定义为int,所以结果(a-50)^2+(b-60)^2也将是int。这将使程序难以选择要使用的 std::sqrt

为了解决这个问题,您可以在调用此函数之前先将其转换为float。像这样:
i=std::sqrt((float) ((a-50)^2+(b-60)^2));

关于c++ - OpenCV获取最接近点的轮廓,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22121772/

10-13 06:31