我在OpenCV中有一个二维点的向量
std::vector<cv::Point2f> points;
Run Code Online (Sandbox Code Playgroud)
我想计算x和y坐标的平均值points
.就像是:
cv::Point2f mean_point; //will contain mean values for x and y coordinates
mean_point = some_function(points);
Run Code Online (Sandbox Code Playgroud)
这在Matlab中很简单.但我不确定我是否可以利用一些高级OpenCV功能来实现同样的目标.有什么建议?
Sam*_*Sam 14
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));
Run Code Online (Sandbox Code Playgroud)
细节:
在较新的OpenCV版本中,InputArray
引入了数据类型.通过这种方式,可以将参数作为参数发送给OpenCV函数,矩阵(cv :: Mat)是矢量.A vector<Vec3f>
将被解释为具有三个通道的浮点矩阵,一行,并且列数等于矢量大小.由于没有复制数据,因此这种透明转换速度非常快.
优点是您可以使用适合您应用程序的任何数据类型,同时您仍然可以使用OpenCV函数来简化数学操作.
Jer*_*fin 10
由于OpenCV Point_
已经定义operator+
,这应该相当简单.首先,我们总结值:
cv::Point2f zero(0.0f, 0.0f);
cv::Point2f sum = std::accumulate(points.begin(), points.end(), zero);
Run Code Online (Sandbox Code Playgroud)
然后我们除以得到平均值:
Point2f mean_point(sum.x / points.size(), sum.y / points.size());
Run Code Online (Sandbox Code Playgroud)
......或者我们可以使用Point_
的operator*
:
Point2f mean_point(sum * (1.0f / points.size()));
Run Code Online (Sandbox Code Playgroud)
不幸的是,至少就我所见,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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13463 次 |
最近记录: |