OpenCV 扑克牌模板匹配

问题描述 投票:0回答:1

在我的桥牌训练课程中,我尝试通过捕获图像来分析在 Bridge Base Online 中进行的交易,然后尝试找到 52 张牌在哪里。

参考图片是这张(capture.jpg) enter image description here

我还有 52 张卡片图像 (41x68),例如黑桃 5:

enter image description here

现在在 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 张卡...

enter image description here

如何增强我的算法?

如果我将阈值提高到 0.87,它只会找到一张牌,而是梅花 5。

谢谢。

c++ opencv game-automation
1个回答
0
投票

您以某种方式调整了窗口大小,对吗?

matchTemplate()
不测试多个尺度。它精确测试您给它的模板,不会更大,也不会更小。

您可以通过调整窗口大小,而是保持其单一大小,并从该大小/比例中获取模板来解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.