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 回答