初步认识
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include
using namespace cv;
using namespace std;
//声明一些全局变量,比如图像、模板和结果矩阵,以及匹配方法和窗口名称
Mat img; Mat templ; Mat result;
char* image_window = "Source Image";
char* result_window = "Result window";
int match_method;
int main(int argc, char* argv[])
{
//图片加载
img = imread("E:\\研究生\\数字图像处理\\c++\\字符识别\\Project1\\ocr\\1.png");
templ = imread("E:\\研究生\\数字图像处理\\c++\\字符识别\\Project1\\ocr\\template\\1.png");
namedWindow(image_window, WINDOW_AUTOSIZE);
namedWindow(result_window, WINDOW_AUTOSIZE);
//创建将存储每个模板位置匹配结果的结果矩阵。详细观察结果矩阵的大小(匹配所有可能的位置)
int result_cols = img.cols - templ.cols + 1;
int result_rows = img.rows - templ.rows + 1;
result.create(result_rows, result_cols, CV_32FC1);
//执行模板匹配
matchTemplate(img, templ, result, match_method);
// 归一化
normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());
//利用cv::minMaxLoc对结果矩阵R中的最小值和最大值进行局部定位
double minVal; double maxVal; Point minLoc; Point maxLoc;
Point matchLoc;
minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
//对于前两个方法(TM_SQDIFF和MT_SQDIFF_NORMED),最好的匹配是最小值。
//对于其他来说,值越高代表匹配越好。因此,我们将相应的值保存在matchLoc变量中:
if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED)
{
matchLoc = minLoc;
}
else
{
matchLoc = maxLoc;
}
//显示源图像和结果矩阵。在可能匹配的最高区域周围画一个矩形
rectangle(img, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );
rectangle( result, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );
imshow( image_window, img);
imshow( result_window, result );
waitKey(0);
destroyAllWindows();
}
-
大图是匹配的效果
字符识别算法
想法:把所有的字符模板放到一张图片,根据其各自位置建一个列表,将分割好的图片一次检测匹配,根据其在模板大图上的位置,根据索引在列表找到对应的字符
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include
#include
#include