• 大小: 26.05MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-07-07
  • 语言: 其他
  • 标签: 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\number_recognition\
     目录           0  2018-09-12 15:27  number_recognition\.vs\number_recognition\v15\
     文件       34816  2018-09-12 15:27  number_recognition\.vs\number_recognition\v15\.suo
     文件    22282240  2018-09-12 15:27  number_recognition\.vs\number_recognition\v15\Browse.VC.db
     目录           0  2018-09-10 19:29  number_recognition\.vs\number_recognition\v15\ipch\
     目录           0  2018-09-10 19:29  number_recognition\.vs\number_recognition\v15\ipch\AutoPCH\
     目录           0  2018-09-11 10:47  number_recognition\.vs\number_recognition\v15\ipch\AutoPCH\c2870fb4b32c1cb\
     文件    99549184  2018-09-12 09:26  number_recognition\.vs\number_recognition\v15\ipch\AutoPCH\c2870fb4b32c1cb\MAIN.ipch
     目录           0  2018-09-12 15:20  number_recognition\number_recognition\
     目录           0  2018-09-11 10:52  number_recognition\number_recognition\image\
     文件        1445  2018-09-12 10:26  number_recognition\number_recognition\image\0.jpg
     文件        1178  2018-09-12 10:26  number_recognition\number_recognition\image\1.jpg
     文件        1874  2018-09-12 10:26  number_recognition\number_recognition\image\2.jpg
     文件        1993  2018-09-12 10:26  number_recognition\number_recognition\image\3.jpg
     文件        1139  2018-09-12 10:26  number_recognition\number_recognition\image\4.jpg
     文件        1906  2018-09-12 10:26  number_recognition\number_recognition\image\5.jpg
     文件        1790  2018-09-12 10:26  number_recognition\number_recognition\image\6.jpg
     文件        1388  2018-09-12 10:26  number_recognition\number_recognition\image\7.jpg
     文件        1745  2018-09-12 10:26  number_recognition\number_recognition\image\8.jpg
     文件        1851  2018-09-12 10:26  number_recognition\number_recognition\image\9.jpg
     文件        3919  2018-09-12 15:20  number_recognition\number_recognition\main.cpp
     文件        5624  2018-09-10 19:14  number_recognition\number_recognition\number.jpg
     文件       13038  2018-09-11 10:54  number_recognition\number_recognition\number2.jpg
     文件        8100  2018-09-12 10:29  number_recognition\number_recognition\number3.jpg
     文件        5955  2018-09-10 19:45  number_recognition\number_recognition\number_recognition.vcxproj
     文件         949  2018-09-10 19:45  number_recognition\number_recognition\number_recognition.vcxproj.filters
     文件         165  2018-09-10 19:28  number_recognition\number_recognition\number_recognition.vcxproj.user
     文件       16541  2018-09-12 10:18  number_recognition\number_recognition\template.jpg
     目录           0  2018-09-10 19:45  number_recognition\number_recognition\x64\
............此处省略19个文件信息

评论

共有 条评论