OpenCV C ++使用cv :: Moments [英] OpenCV C++ usage of cv::Moments
本文介绍了OpenCV C ++使用cv :: Moments的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我尝试使用OpenCV C ++的cv :: Moments找到质心。无论我提交什么参数,我收到的全部都是零。显然,我做了一件非常错误的事情。输出代码:
I try to find centroid using OpenCV C++'s cv::Moments. Whatever arguments I submit to it, All I receive back are zeros. Clearly I do something very simply wrong. Output of code:
23 of 500 elements in unit 3
point values 2.976444 18.248287
matrix size 23
moments 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
moments 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
和代码:
printf("%d of %d elements in unit %d\n",k,number_of_features,i);
cv::Mat x(k, 1, cv::DataType<cv::Point2f>::type);
k=0;
for(int j=0;j <number_of_features;j++) {
if(i == labels.at<int>(j)) {
x.at<cv::Point2f>(k++) = samples.at<cv::Point2f>(i);
}
}
printf("point values %f %f\n", x.at<cv::Point2f>(0).x,x.at<cv::Point2f>(0).y);
cv::Size s=x.size();
printf("matrix size %d\n",s.height);
cv::Moments m=cv::moments(x);
printf("moments %f %f %f %f %f %f %f %f\n",m.m00,m.m01,m.m20,m.m11,m.m02,m.m30,m.m21,m.m03);
double h[7];
cv::HuMoments(m,h);
printf("moments %f %f %f %f %f %f %f\n",h[0],h[1],h[2],h[3],h[4],h[5],h[6]);
奇怪的是我无法从Google找到任何相同的代码示例。所有我看到的都是C风格的方法。
Strangely I cannot find any identical code sample from Google. All I see are C style approaches.
推荐答案
利用片刻找到一个质心有点矫枉过正。
您可以使用以下算法:
Using moments to find a centroid is a bit overkill imho. You can use the following algorithm to do it:
sumX = 0; sumY = 0;
size = array_points.size;
if(size > 0){
foreach(point in array_points){
sumX += point.x;
sumY += point.y;
}
centroid.x = sumX/size;
centroid.y = sumY/size;
}
或者在Opencv的boundingRect的帮助下:
Or with the help of Opencv's boundingRect:
//pseudo-code:
Rect bRect = Imgproc.boundingRect(array_points);
centroid.x = bRect.x + (bRect.width / 2);
centroid.y = bRect.y + (bRect.height / 2);
这篇关于OpenCV C ++使用cv :: Moments的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文