计算点向量的平均值

Calculate mean for vector of points

本文关键字:平均值 向量 计算      更新时间:2023-10-16

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

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

我想计算points中x和y坐标的平均值。类似于:

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

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

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函数。vector<Vec3f>将被解释为具有三个通道、一行和等于矢量大小的列数的浮点矩阵。因为没有复制任何数据,所以这种透明转换非常快。

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

由于OpenCV的Point_已经定义了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_operator*:

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

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

您可以使用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

将它们全部相加,除以总点数。