1

画像から輪郭を見つけました。等高線から最小点と最小点を見つけたい。

vector<Point> test = contours[0];
auto mmx = std::minmax_element(test.begin(), test.end(), less_by_y);

bool less_by_y(const cv::Point& lhs, const cv::Point& rhs)
{
    return lhs.y < rhs.y;
}

このコーディングを試してみましたが、正常に実行されました。しかし、私の愚かさのために、mmx からデータを取得する方法がわかりません。誰でも私を助けてください?

等高線から点 y の値にアクセスしたい場合、どうすればよいですか? 私はこれらのデータ型を本当に混乱させました。

4

2 に答える 2

2

minmax_element のドキュメントから、イテレータのペアを返すことがわかります。

与えられた:

vector<Point> pts = ...
auto mmx = std::minmax_element(pts.begin(), pts.end(), less_by_y);

mmx.firstで min 要素へのイテレータ、 で max 要素へのイテレータにアクセスできますmmx.second

最小値と最大値を取得する場合は、次のようにyする必要があります。

int min_y = mmx.first->y;
int max_y = mmx.second->y;

yOpenCV を使用しているため、次を使用して値を見つけることもできますboudingRect

Rect box = boundingRect(pts);
std::cout << "min y: " << box.tl().y << std::endl;
std::cout << "max y: " << box.br().y - 1 << std::endl; // Note the -1!!!

これはおそらく遅くなりますが、カスタム比較関数を定義する必要はありません。これは、必要に応じて min と max も計算しxます。


ここに完全な例があります:

#include <opencv2/opencv.hpp>
#include <algorithm>
#include <iostream>
using namespace cv;

bool less_by_y(const cv::Point& lhs, const cv::Point& rhs)
{
    return lhs.y < rhs.y;
}

int main(int argc, char** argv)
{
    // Some points
    vector<Point> pts = {Point(5,5), Point(5,0), Point(3,5), Point(3,7)};

    // Find min and max "y"
    auto mmx = std::minmax_element(pts.begin(), pts.end(), less_by_y);

    // Get the values
    int min_y = mmx.first->y;
    int max_y = mmx.second->y;

    // Get the indices in the vector, if needed
    int idx_min_y = std::distance(pts.begin(), mmx.first);
    int idx_max_y = std::distance(pts.begin(), mmx.second);

    // Show results
    std::cout << "min y: " << min_y << " at index: " << idx_min_y << std::endl;
    std::cout << "max y: " << max_y << " at index: " << idx_max_y << std::endl;

    // Using OpenCV boundingRect

    Rect box = boundingRect(pts);
    std::cout << "min y: " << box.tl().y << std::endl;
    std::cout << "max y: " << box.br().y - 1 << std::endl; // Note the -1!!!

    return 0;
}
于 2015-11-22T12:10:05.077 に答える
0

ドキュメントから: _std::minmax()

最初の要素として最小の要素への反復子と、2 番目の要素として最大の要素への反復子から構成されるペア。範囲が空の場合、std::make_pair(first, first) を返します。複数の要素が最小の要素と等しい場合、最初のそのような要素へのイテレータが返されます。複数の要素が最大の要素と等しい場合、最後のそのような要素へのイテレータが返されます。

最小mmx.first値とmmx.second最大値も同様です。

于 2015-11-22T09:34:27.207 に答える