计算点向量的平均值
Calculate mean for vector of points
我在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
将它们全部相加,除以总点数。
相关文章:
- 计算数组c++的平均值
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- 五个中三个最大参数的平均值,不使用排序算法或向量/数组
- 获取 c++ 中浮点数向量的向量的逐元素平均值
- 如何使用向量查找平均值和标准差
- 查找向量的平均值
- 查找记录等于或最接近使用向量C 的平均值
- 使用模板计算向量的平均值
- 通过更改代码格式来计算结构向量中包含的双精度变量的平均值的不同结果?
- 计算存储在向量中的值流的移动平均值
- 求向量c++的输入的平均值
- 计算点向量的平均值
- 如何找到向量的统计量?最大值/最小值、模式、中位数、平均值