资源简介
通过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个文件信息
相关资源
- vc车牌识别程序源代码
- opencv1.1pre1版本
- 基于qt和opencv的图片变形程序
- 用opencv的SVM做行人识别
- opencv对头发图片进行颜色渲染源代码
- OpenCV基于霍夫变换实现对圆形物体的
- ippicv_2019_win_ia32_20180723_general.zip
- opencv 神经网络训练用英文字库.zip
- opencv金字塔模板匹配算法
- OpenCV级联分类器训练与使用教程与代
- VS2013+OpenCV3.4.1+OpenCVContrib(x64)编译好
- Vlc获取rtsp视频流opencv显示
- Opencv3.0.0人脸检测+识别代码,vs2012工
- ffmpeg4+OpenCV3+VS2017 H264编解码
- OpenCV与OpenGL实现增强现实
- 学习opencv 中文版 pdf 带完整目录
- ippicv_windows_20151201.zip
- 几个基于openCV开发的手势识别代码
- OpenCV3.3 mingw64位编译 包含contribute部分
- opencv3.2.0依赖项ippicv_linux_20151201.tgz
- Opencv3.2_VS2015_64bit_debug/release
- 多目标跟踪vs+opencv
- opencv 的汽车分类器的正样本。
- opencv人脸识别demo并保存头像小照片
- opencv 1.2 安装
- Machine Learning for OpenCV 原版PDF by Beye
- Learning-OpenCV-3_examples.zip
- Learning OpenCV Computer Vision with the OpenC
- 官方版opencv1.0 windows系统
- 二维码定位符识别带
评论
共有 条评论