cv::Moments 的 OpenCV C++ 用法
Posted
技术标签:
【中文标题】cv::Moments 的 OpenCV C++ 用法【英文标题】:OpenCV C++ usage of cv::Moments 【发布时间】:2012-06-08 03:31:03 【问题描述】:我尝试使用 OpenCV C++ 的 cv::Moments 来查找质心。无论我提交什么论据,我收到的都是零。很明显,我做了一些非常简单的错误。代码输出:
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 风格的方法。
【问题讨论】:
【参考方案1】:使用矩来找到质心有点过分恕我直言。 您可以使用以下算法来做到这一点:
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:
//pseudo-code:
Rect bRect = Imgproc.boundingRect(array_points);
centroid.x = bRect.x + (bRect.width / 2);
centroid.y = bRect.y + (bRect.height / 2);
【讨论】:
谢谢!首先,我确认您的方法有效,其次我发现了我的错误,因为使用您的代码。我使用的是“i”而不是“j”:x.at<:point2f>(k++) = samples.at<:point2f>(j /*BUG WAS HERE*/);【参考方案2】:我会推荐你访问官方教程。首先学习并运行该代码。
http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/moments/moments.html#moments
一旦成功,尝试实现任何你想要的。
【讨论】:
好吧,它适用于轮廓序列,但我需要它适用于一维浮点数组。这些差异中的某些东西会阻止它。至少我是这么认为的。以上是关于cv::Moments 的 OpenCV C++ 用法的主要内容,如果未能解决你的问题,请参考以下文章