最近学习了opencv,然后想通过其对图片上的数字进行识别,参考了网上几篇关于opencv数字识别的博客,我自己也写了一个程序玩玩。我是在vs2017和opencv3.4.1环境下实现的。
这里先说一下我的思路和步骤:
- 加载需要识别的图片,然后将其转化为二值图
- 寻找数字的外轮廓,切记不可以找全部轮廓,否则一个数字将会有多个轮廓,识别起来就很麻烦了
- 对轮廓进行排序,因为使用findcontours函数寻找到的轮廓顺序不一定是我们想要的,因此需要对找到的数字轮廓根据输入的图片进行排序
- 按顺序将数字轮廓分割,一个一个提取出来
- 进行识别和匹配,将提取出来的数字与模板数字(需要自己创建)进行比较,这里采用两幅图片像素相减的方法,寻找出差值最小的图片即为最匹配的数字
一、图片预处理
将输入的图片转化为二值图以便寻找轮廓
//输入要识别的图片,并显示
Mat srcImage = imread("number.jpg");
imshow("原图", srcImage);
//对图像进行处理,转化为灰度图然后再转为二值图
Mat grayImage;
cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);
Mat binImage;
//第4个参数为CV_THRESH_BINARY_INV是因为我的输入原图为白底黑字
//若为黑底白字则选择CV_THRESH_BINARY即可
threshold(grayImage, binImage, 100, 255, CV_THRESH_BINAR