3

Chessboard を使用して OpenCV で 3D キャリブレーションのプロジェクトに取り組んでいます。キャリブレーションは正常に機能しますが、下の画像のように、チェス盤内のオブジェクトも黒く、互いに異なるはずであることを認識したいと考えています。これを行う方法がわかりません。この目標を達成するには、どの OpenCV 関数が役立つでしょうか?

.

@Aurelius の提案の後、cv::matchTemplate を使用しようとしましたが、最初に実行すると正常に動作しますが、キャプチャで実行すると結果が完全に間違っています 次の画像を参照してください

捕獲 これがどのように解決できるかについての考え

4

2 に答える 2

3

形状がどのように見えるかを事前に知っていて、チェス盤の画像が例のようにまっすぐに撮られている場合、cv::matchTemplate(). 以下のコードは、テンプレート画像に最もよく一致する領域を画像から検索します。

cv::Mat chessboard = cv::imread(path_to_image);
cv::Mat template1 = cv::imread(temp1_path);
cv::Mat template2 = cv::imread(temp2_path);

cv::Mat cross_corr;
cv::Point maxloc;

// Find the first template
cv::matchTemplate(chessboard, template1, cross_corr, CV_TM_CCORR_NORMED);
cv::minMaxLoc(cross_corr, nullptr, nullptr, nullptr, &maxloc);    //Only want location of maximum response
cv::Rect t1rect(maxloc,template1.size());

//Find the second template
cv::matchTemplate(chessboard, template2, cross_corr, CV_TM_CCORR_NORMED);
cv::minMaxLoc(cross_corr, nullptr,nullptr,nullptr,&maxloc);
cv::Rect t2rect(maxloc, template2.size());

//Draw the results
cv::rectangle(chessboard, t1rect, cv::Scalar(255,0,0), 3);
cv::rectangle(chessboard, t2rect, cv::Scalar(0,0,255), 3);
cv::imshow("detection", chessboard);

これらのテンプレートの使用: テンプレート 1 テンプレート 2 上記のコードにより、次の出力が得られます。

ここに画像の説明を入力

于 2013-06-19T15:47:25.333 に答える
0

テンプレート マッチングは回転不変ではありません。テンプレート マッチングの前にチェス盤の画像を回転させますか (これにはキャリブレーションが必要です)。

于 2013-06-20T06:40:19.130 に答える