0

私はいくつかのプロジェクトにopencvを使用しています。そして、解決すべき課題があります。タスクは非常に簡単です。メインの写真とテンプレートを比較するよりも、メインの写真とテンプレートがあります。matchTemplate()関数を使用します。私は一瞬だけ好奇心を持っています。ドキュメントで、次の情報を見つけました。一致する領域を特定するには、テンプレート画像をスライドさせてソース画像と比較する必要があります。スライドとは、パッチを一度に1ピクセルずつ(左から右、上から下に)移動することを意味します。各場所でメトリックが計算されるため、その場所での一致がどの程度「良好」または「不良」であるか(またはパッチがソースイメージの特定の領域にどの程度類似しているか)を表します。T over Iの位置ごとに、メトリックを結果行列(R)に格納します。Rの各場所には、一致メトリックが含まれています。

たとえば、メインの画像とテンプレートがあります。そして、少なくともメインの写真にはテンプレートのエントリが1つあることを知っています。そしてそれはうまくいきます。しかし、メインの画像0または10にテンプレートがいくつあるかわからない場合はどうでしょうか。それを計算する方法はありますか?どのアルゴリズムを使用する必要がありますか?結果マトリックスのメトリックが何を意味するのかをどのように理解できますか?前もって感謝します。

4

1 に答える 1

1

matchTemplate() 関数は、指定されたテンプレートがその時点で画像とどの程度一致するかの値をすべてのピクセルが保持する新しいマトリックスを作成します。テンプレートに一致するすべての領域を検出するには、結果マトリックスを調べて、特定のしきい値を超えるかどうかをすべてのピクセルで確認する必要があります。
ピクセルがしきい値を超える場合、それはテンプレートに一致する画像内の領域の左上隅であることを意味します。簡単な実装は次のようになります。

double PATT_THRESH = 0.4
IplImage *result = cvCreateImage(cvSize(imageW, imageH), IPL_DEPTH_32F, 1);
vector<CvPoint> foundTemplates;
cvMatchTemplate(image, pattern, result, CV_TM_SQDIFF_NORMED);
for (int i = 0 ; i < result->width ; ++i) {
    for (int j = 0 ; j < result->height ; ++j) {
        if (cvGet2D(result, j, i).val[0] < PATT_THRESH) {
            foundTemplates.push_back(cvPoint(i, j);
        }
    }

}

使用している言語はわかりませんが、他の言語に翻訳するのは簡単です。それが役立つことを願っています。

于 2013-02-11T14:56:02.903 に答える