在我的桥牌训练课程中,我尝试通过捕获图像来分析在 Bridge Base Online 中进行的交易,然后尝试找到 52 张牌在哪里。
我还有 52 张卡片图像 (41x68),例如黑桃 5:
现在在 OpenCV 中进行模式匹配时:
Mat1f result;
matchTemplate(org_gray, template_gray, result, TM_CCOEFF_NORMED);
double thresh = 0.8;
threshold(result, result, thresh, 1., THRESH_BINARY);
Mat1b resb;
result.convertTo(resb, CV_8U, 255);
std::vector<std::vector<Point>> contours;
findContours(resb, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);
for (int i = 0; i < contours.size(); ++i)
{
Mat1b mask(result.rows, result.cols, uchar(0));
drawContours(mask, contours, i, Scalar(255), cv::FILLED);
Point max_point,min_point;
double max_val;
minMaxLoc(result, NULL, &max_val, &min_point, &max_point, mask);
rectangle(img, Rect(max_point.x, max_point.y, ptpw->m.cols, ptpw->m.rows), Scalar(0, 255, 0), 2);
}
imshow("b", ptpw->m);
imshow("a",img);
结果就是这个。它确实检测到了 S5 的位置,但还检测到了另外 7 张卡...
如何增强我的算法?
如果我将阈值提高到 0.87,它只会找到一张牌,而是梅花 5。
谢谢。
您以某种方式调整了窗口大小,对吗?
matchTemplate()
不测试多个尺度。它精确测试您给它的模板,不会更大,也不会更小。
您可以通过不调整窗口大小,而是保持其单一大小,并从该大小/比例中获取模板来解决此问题。