数字识别
ROI抽取:将目标区域从原始图像粗分离(二值化,噪声处理)
识别:对目标区域的进一步分离
ROI 抽取
位深度:每个像素占用的位(bit)
24位颜色可称之为真彩色,位深度是24,它能组合成2的24次幂种颜色,即:16777216种颜色 ( 或称千万种颜色 ),超过了人眼能够分辨的颜色数量。
当我们用24位来记录颜色时,实际上是以2^(8×3),即红、绿、蓝 ( RGB ) 三基色各以2的8次幂,256种颜色而存在的,三色组合就形成一千六百万种颜色。
通道:任意的单色灰阶图(R 、 G 、 B三个原色通道)。
掩码 :
mask = Mat::zeros(image.size(), CV_8UC1);
mask(r1).setTo(255); //r1是设置好的感兴趣区域(Region Of Interest)
- 第一步建立与原图一样大小的mask图像,并将所有像素初始化为0,因此全图成了一张全黑色图。
- 第二步将mask图中的r1区域的所有像素值设置为255,也就是整个r1区域变成了白色。
image.copyTo(img2, mask);
原始图image透过mask赋值到目的图img2上。即原图中的每个像素和mask中的每个对应像素进行与运算(&)。比如1 & 1 = 1;1 & 0 = 0;
识别
处理图像
-
转化为灰度值(较之原图,三个维度的矩阵变成了一个维度)
-
转化为二值图(由灰度图转化成黑白图,每个点非黑即白)
阈值 threshold一个效应能够产生的最低值或最高值
检测并勾勒轮廓(考虑连通性,扫描线)
将二值图中的可连通的区域用一坨点表示,默认的轮廓检查会返回一个点的序列,使这个序列构成一个图形将该连通区域的所有点包围起来,比如四个点构成一个矩形。
特例:由于8这个数字中有两个圆圈,默认的轮廓检查会将这两个圆圈都检测到,8就会有三个轮廓,同样还可能出现这种情况的还有数字4,6,9。
因此需要指定findContours
()函数仅搜索最外层的轮廓,而不关注内部可能出现的任何轮廓。
检测完轮廓后,使用contours迭代器遍历每一个轮廓,找到并画出包围这个轮廓的最小矩阵。
但是,上述方法画出的矩形为旋转矩形(不一定水平) ,所以不采用这种方法。应使用boundingRect()画出矩形。
数字顺序整理(扫描线)
由于轮廓检测时,不一定按照图中所给顺序进行检测,所以在检测轮廓时,要记录所给数字的坐标,根据x,y坐标进行排序。
我按轮廓检测顺序的将矩阵的中心点存入结构体中,然后调用sort()函数。
sort(con,con+i); //正确
sort(con,con+i+1); //错误
//WORTH FIGURING OUT
切割各个数字
使用ROI进行切割
最后的识别
将按轮廓线切割好的数字与标准数字文件比对,采用逐点像素遍历法。
utf-8 : unicode transformation format
来源:
cnblogs.com/farewell-farewell/archive/2004/01/13/5887068.html