opencv 数字识别

数字识别

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;

识别

处理图像

  1. 转化为灰度值(较之原图,三个维度的矩阵变成了一个维度)

  2. 转化为二值图(由灰度图转化成黑白图,每个点非黑即白)

    阈值 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

你可能感兴趣的:(c++,project,opencv,计算机视觉)