我只是编写一个函数来获取最接近点的对象的轮廓。我觉得不是那么难,但我不知道为什么我不能在这个函数中使用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);
}
答案 0 :(得分:2)
您可以使用cv::pointPolygonTest计算点多边形距离。
答案 1 :(得分:1)
i=std::sqrt((a-50)^2+(b-60)^2);
^^^^^^^^^^^^^^^^^
由于a
,b
定义为int
,因此结果(a-50)^2+(b-60)^2
也将为int
。这将使程序不明确地选择要使用的std::sqrt
。
要解决此问题,您可以在调用此函数之前先将其强制转换为float
。像这样:
i=std::sqrt((float) ((a-50)^2+(b-60)^2));