形状がどのように見えるかを事前に知っていて、チェス盤の画像が例のようにまっすぐに撮られている場合、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);
これらのテンプレートの使用:
上記のコードにより、次の出力が得られます。