我正在使用Chessboard开发一个使用OpenCV进行3D校准的项目。校准工作正常,但我想识别棋盘中的物体也是黑色的,并且应该彼此不同,如下图所示。我不知道该怎么做。哪些OpenCV功能有助于实现这一目标?
在@Aurelius的建议之后我尝试使用cv :: matchTemplate,当我在第一次运行它时它工作正常但是当我在捕获时运行它时结果完全错误看到下一个图像
任何想法如何解决
答案 0 :(得分: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 :(得分:0)
模板匹配不是旋转不变的。您是否在模板匹配之前旋转棋盘图像(这是需要校准的。)