4

OpenCV テンプレート マッチングを使用して、別の画像内の画像を検索しています。

具体的には、一致の類似度マップを含むmatchTemplate()を返します。cv::Mat

を使用する以外cv::Pointに、それに含まれるをソートする方法はありますか?cv::MatminMaxLoc()

    minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);

私が試してみました:

    cv::Mat_<uchar>::iterator it = result.begin<uchar>();
    cv::Mat_<uchar>::iterator end = result.end<uchar>();
    for (; it != end; ++it)
    {
        cv::Point test(it.pos());
    }

限られた成功で。

4

1 に答える 1

4

私があなたを正しく理解していれば、一致スコアでピクセルを並べ替え、並べ替えられた順序でこれらのピクセルに対応するポイントを取得したいと考えています。これはresult、単一の行になるように再形成し、呼び出しcv::sortIdx()てピクセルのインデックスを並べ替えた順序で取得することで実現できます。次に、インデックスを先頭からのオフセットとして使用してresult、その特定のピクセルの位置を取得できます。

更新:コードに 1 つの問題がある可能性があることに気付きました。データresultが含まれていると想定しているようです。データが含まれている必要があります。ucharcv::matchTemplate()resultfloat

cv::Mat_<int> indices;
cv::sortIdx(result.reshape(0,1), indices, CV_SORT_DESCENDING + CV_SORT_EVERY_ROW);

cv::Mat_<float>::const_iterator begin = result.begin<float>();
cv::Mat_<int>::const_iterator it = indices.begin();
cv::Mat_<int>::const_iterator end = indices.end();
for (; it != end; ++it)
{
    cv::Point pt = (begin + *it).pos();
    // Do something with pt...
}
于 2013-07-31T18:05:54.457 に答える