模板匹配
1.思路
截取模板----->模板匹配----->画框
1.手动截取模板
读模板templateImages.push_back(cv::imread("D:/photo/books/11.png", cv::IMREAD_COLOR));
templateImages.push_back(cv::imread("D:/photo/books/22.png", cv::IMREAD_COLOR));
templateImages.push_back(cv::imread("D:/photo/books/44.png", cv::IMREAD_COLOR));
templateImages.push_back(cv::imread("D:/photo/books/55.png", cv::IMREAD_COLOR));
templateImages.push_back(cv::imread("D:/photo/books/77.png", cv::IMREAD_COLOR));
templateImages.push_back(cv::imread("D:/photo/books/88.png", cv::IMREAD_COLOR));
templateImages.push_back(cv::imread("D:/photo/books/CC.png", cv::IMREAD_COLOR));
templateImages.push_back(cv::imread("D:/photo/books/xiegang.png", cv::IMREAD_COLOR));
templateImages.push_back(cv::imread("D:/photo/books/dian.png", cv::IMREAD_COLOR));
添加字签
// 字符标签
std::vector<std::string> labels = {"1", "2","4","5","7","8","C","xg","dian"};


2.模板匹配
使用模板匹配函数matchTemplate();
for (size_t i = 0; i < templateImages.size(); i++) {
cv::Mat templImage = templateImages[i];
cv::matchTemplate(srcImage, templImage, resultImage, cv::TM_CCOEFF_NORMED);
cv::Point minLoc, maxLoc;
double threshold = 0.5; // 可根据实际情况调整
cv::minMaxLoc(resultImage, &minVal, &maxVal, &minLoc, &maxLoc);
cv::rectangle(srcImage, matchLoc, cv::Point(matchLoc.x + templImage.cols, matchLoc.y + templImage.rows), cv::Scalar(0, 255, 0), 2);
cv::putText(srcImage, labels[i], matchLoc, cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 0, 200), 2);
cv::floodFill(resultImage, maxLoc, cv::Scalar(0), 0, cv::Scalar(0.1), cv::Scalar(1.0));
3.画框
cv::rectangle(srcImage, matchLoc, cv::Point(matchLoc.x + templImage.cols, matchLoc.y + templImage.rows), cv::Scalar(0, 255, 0), 2);
cv::putText(srcImage, labels[i], matchLoc, cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 0, 200), 2);
cv::floodFill(resultImage, maxLoc, cv::Scalar(0), 0, cv::Scalar(0.1), cv::Scalar(1.0));

2.代码
cv::Mat srcImage = cv::imread("D:/photo/books/moban5.jpg", cv::IMREAD_COLOR);
cv::Mat src = cv::imread("D:/photo/books/moban5.jpg", cv::IMREAD_COLOR);
std::vector<cv::Mat> templateImages;
templateImages.push_back(cv::imread("D:/photo/books/11.png", cv::IMREAD_COLOR));
templateImages.push_back(cv::imread("D:/photo/books/22.png", cv::IMREAD_COLOR));
templateImages.push_back(cv::imread("D:/photo/books/44.png", cv::IMREAD_COLOR));
templateImages.push_back(cv::imread("D:/photo/books/55.png", cv::IMREAD_COLOR));
templateImages.push_back(cv::imread("D:/photo/books/77.png", cv::IMREAD_COLOR));
templateImages.push_back(cv::imread("D:/photo/books/88.png", cv::IMREAD_COLOR));
templateImages.push_back(cv::imread("D:/photo/books/CC.png", cv::IMREAD_COLOR));
templateImages.push_back(cv::imread("D:/photo/books/xiegang.png", cv::IMREAD_COLOR));
templateImages.push_back(cv::imread("D:/photo/books/dian.png", cv::IMREAD_COLOR));
std::vector<std::string> labels = {"1", "2","4","5","7","8","C","xg","dian"};
for (size_t i = 0; i < templateImages.size(); i++) {
cv::Mat templImage = templateImages[i];
cv::matchTemplate(srcImage, templImage, resultImage, cv::TM_CCOEFF_NORMED);
cv::Point minLoc, maxLoc;
double threshold = 0.5; // 可根据实际情况调整
cv::minMaxLoc(resultImage, &minVal, &maxVal, &minLoc, &maxLoc);
cv::rectangle(srcImage, matchLoc, cv::Point(matchLoc.x + templImage.cols, matchLoc.y + templImage.rows), cv::Scalar(0, 255, 0), 2);
cv::putText(srcImage, labels[i], matchLoc, cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 0, 200), 2);
cv::floodFill(resultImage, maxLoc, cv::Scalar(0), 0, cv::Scalar(0.1), cv::Scalar(1.0));