10

我在 OpenCV 中有一个二维点的向量

std::vector<cv::Point2f> points;

我想计算 x 和 y 坐标的平均值points。就像是:

cv::Point2f mean_point; //will contain mean values for x and y coordinates
mean_point = some_function(points); 

这在 Matlab 中很简单。但我不确定我是否可以利用一些高级 OpenCV 函数来完成同样的任务。有什么建议么?

4

4 回答 4

15

InputArray在这里做得很好。你可以简单地打电话

cv::Mat mean_;
cv::reduce(points, mean_, 01, CV_REDUCE_AVG);
// convert from Mat to Point - there may be even a simpler conversion, 
// but I do not know about it.
cv::Point2f mean(mean_.at<float>(0,0), mean_.at<float>(0,1)); 

细节:

在较新的 OpenCV 版本中,InputArray引入了数据类型。这样,可以将矩阵 (cv::Mat) 或向量作为参数发送到 OpenCV 函数。Avector<Vec3f>将被解释为具有三个通道、一行且列数等于向量大小的浮点矩阵。因为没有数据被复制,所以这种透明转换非常快。

优点是您可以使用更适合您的应用程序的任何数据类型,同时您仍然可以使用 OpenCV 函数来简化对它的数学运算。

于 2012-07-19T18:58:36.817 回答
10

由于 OpenCVPoint_已经定义了operator+,这应该相当简单。首先我们对这些值求和:

cv::Point2f zero(0.0f, 0.0f);

cv::Point2f sum  = std::accumulate(points.begin(), points.end(), zero);

然后我们除以得到平均值:

Point2f mean_point(sum.x / points.size(), sum.y / points.size());

...或者我们可以使用Point_'s operator*

Point2f mean_point(sum * (1.0f / points.size()));

不幸的是,至少据我所知,Point_没有定义operator /,所以我们需要乘以倒数而不是除以大小。

于 2012-07-19T18:53:36.290 回答
6

您可以使用 stl 的std::accumulate如下:

cv::Point2f sum = std::accumulate(
    points.begin(), points.end(), // Run from begin to end
    cv::Point2f(0.0f,0.0f),       // Initialize with a zero point
    std::plus<cv::Point2f>()      // Use addition for each point (default)
);
cv::Point2f mean = sum / points.size(); // Divide by count to get mean
于 2012-07-19T18:57:24.040 回答
0

将它们全部加起来并除以总点数。

于 2012-07-19T18:51:46.483 回答