10

OpenCV に 2 次元の点のベクトルがあります

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>は、3 つのチャネル、1 つの行、およびベクトル サイズに等しい列数を持つ float 行列として解釈されます。データがコピーされないため、この透過的な変換は非常に高速です。

利点は、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_ます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 に答える