基于opencv的数字识别


通过opencv对图片上的数字进行识别。识别方式和步骤主要是寻找出数字的外轮廓,然后根据轮廓外接矩阵对数字进行分割,然后根据模板,求出其与分割好的数字的像素差值,找出最匹配的数字。
资源截图
代码片段和文件信息
#define _CRT_SECURE_NO_WARNINGS
#include 
#include 

using namespace std;
using namespace cv;

class myRect
{
public:
myRect(){}
~myRect(){}
myRect(Rect &temp):myRc(temp){}
//比较矩形左上角的横坐标,以便排序
bool operator<(myRect &rect)
{
if (this->myRc.x < rect.myRc.x)
{
return true;
}
else
{
return false;
}
}
//重载赋值运算符
myRect operator=(myRect &rect)
{
this->myRc = rect.myRc;
return *this;
}
//获取矩形
Rect getRect()
{
return myRc;
}
private:
Rect myRc;//存放矩形
};

//求图片的像素和
int getPiexSum(Mat &image)
{
int sum = 0;
for (int i = 0; i < image.cols; i++)
{
for (int j = 0; j < image.rows; j++)
{
sum += image.at(j i);
}
}
return sum;
}

/*主函数*/
int main()
{
//输入要识别的图片,并显示
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_BINARY_INV);

//寻找轮廓,必须指定为寻找外部轮廓,不然一个数字可能有多个轮廓组成,比如4689等数字
Mat conImage = Mat::zeros(binImage.size() binImage.type());
vector> contours;
vector hierarchy;
//指定CV_RETR_EXTERNAL寻找数字的外轮廓
findContours(binImage contours hierarchy CV_RETR_EXTERNAL CV_CHAIN_APPROX_NONE);
//绘制轮廓
drawContours(conImage contours -1 255);

//将每个数字,分离开,保存到容器中
vector sort_rect;
for (int i = 0; i < contours.size(); i++)
{
//boundingRect返回轮廓的外接矩阵
Rect tempRect = boundingRect(contours[i]);
sort_rect.push_back(tempRect);
}

//对矩形进行排序,因为轮廓的顺序不一定是数字真正的顺序
for (int  i = 0; i < sort_rect.size(); i++)
{
for (int j = i + 1; j < sort_rect.size(); j++)
{
if (sort_rect[j] < sort_rect[i])
{
myRect temp = sort_rect[j];
sort_rect[j] = sort_rect[i];
sort_rect[i] = temp;
}
}
}


/*加载模板,若没有则需自己新建一个*/

//新建运行一次就好,不过制作模板的材料为0-9十个数字的图像
//for (int i = 0; i < 10; i++)
//{
// Mat ROI = conImage(sort_rect[i].getRect());
// Mat dstROI;
// resize(ROI dstROI Size(40 50)0 0 INTER_NEAREST);
// char name[64];
// sprintf(name “C:/Users/Administrator/Desktop/number_recognition/number_recognition/image/%d.jpg“ i);
// //imshow(str dstROI);
// imwrite(name dstROI);
//}

//加载模板
vector myTemplate;
for (int i = 0; i < 10; i++)
{
char name[64];
sprintf(name “C:/Users/Administrator/Desktop/number_recognition/number_recognition/image/%d.jpg“ i);
Mat temp = imread(name 0);
myTemplate.push_back(temp);
}

//按顺序取出和分割数字
vector myROI;
for (int i = 0; i < sort_rect.size(); i++)
{
Mat ROI;
ROI = conImage(sort_rect[i].getRect());
Mat dstROI = Mat::zeros(myTemplate[0].size()myTemplate[0].type());
resize(ROI dstROI myTemplate[0].size() 0 0 INTER_NEAREST);
myROI.push_back(dstROI);
}

//进行比较将图片与模板相减,然后求全部像素和,和最小表示越相似

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-09-10 19:45  number_recognition
     目录           0  2018-09-10 19:28  number_recognition.vs
     目录           0  2018-09-10 19:28  number_recognition.vs
umber_recognition
     目录           0  2018-09-12 15:27  number_recognition.vs
umber_recognitionv15
     文件       34816  2018-09-12 15:27  number_recognition.vs
umber_recognitionv15.suo
     文件    22282240  2018-09-12 15:27  number_recognition.vs
umber_recognitionv15Browse.VC.db
     目录           0  2018-09-10 19:29  number_recognition.vs
umber_recognitionv15ipch
     目录           0  2018-09-10 19:29  number_recognition.vs
umber_recognitionv15ipchAutoPCH
     目录           0  2018-09-11 10:47  number_recognition.vs
umber_recognitionv15ipchAutoPCHc2870fb4b32c1cb
     文件    99549184  2018-09-12 09:26  number_recognition.vs
umber_recognitionv15ipchAutoPCHc2870fb4b32c1cbMAIN.ipch
     目录           0  2018-09-12 15:20  number_recognition
umber_recognition
     目录           0  2018-09-11 10:52  number_recognition
umber_recognitionimage
     文件        1445  2018-09-12 10:26  number_recognition
umber_recognitionimage.jpg
     文件        1178  2018-09-12 10:26  number_recognition
umber_recognitionimage1.jpg
     文件        1874  2018-09-12 10:26  number_recognition
umber_recognitionimage2.jpg
     文件        1993  2018-09-12 10:26  number_recognition
umber_recognitionimage3.jpg
     文件        1139  2018-09-12 10:26  number_recognition
umber_recognitionimage4.jpg
     文件        1906  2018-09-12 10:26  number_recognition
umber_recognitionimage5.jpg
     文件        1790  2018-09-12 10:26  number_recognition
umber_recognitionimage6.jpg
     文件        1388  2018-09-12 10:26  number_recognition
umber_recognitionimage7.jpg
     文件        1745  2018-09-12 10:26  number_recognition
umber_recognitionimage8.jpg
     文件        1851  2018-09-12 10:26  number_recognition
umber_recognitionimage9.jpg
     文件        3919  2018-09-12 15:20  number_recognition
umber_recognitionmain.cpp
     文件        5624  2018-09-10 19:14  number_recognition
umber_recognition
umber.jpg
     文件       13038  2018-09-11 10:54  number_recognition
umber_recognition
umber2.jpg
     文件        8100  2018-09-12 10:29  number_recognition
umber_recognition
umber3.jpg
     文件        5955  2018-09-10 19:45  number_recognition
umber_recognition
umber_recognition.vcxproj
     文件         949  2018-09-10 19:45  number_recognition
umber_recognition
umber_recognition.vcxproj.filters
     文件         165  2018-09-10 19:28  number_recognition
umber_recognition
umber_recognition.vcxproj.user
     文件       16541  2018-09-12 10:18  number_recognition
umber_recognition emplate.jpg
     目录           0  2018-09-10 19:45  number_recognition
umber_recognitionx64
............此处省略19个文件信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)