图像识别技术编程实例

时间:2022-06-04 01:55:38

图像识别技术编程实例

【摘 要】本文介绍了以风量罩作为被检器具的图像识别程序,详细阐述了其软件编写过程。

【关键词】图像识别;编程;风量罩

本文采用数字风量罩的显示屏作为图像识别的对象,对其进行智能分析、识别。其具体编程内容如下。

1 识别系统的详细设计图

图1

2 版程序目录结构

images

deviceidCount.dat

devicelist.dat

fluke

ms8222

vc9804

_GMMs

history

newOCR

select

decriptDll.dll

decriptDll.lib

deviceReader.exe

encripts.dat

flannLocate.exe

ImageSeg.exe

msvcp100.dll

msvcr100.dll

opencv_calib3d243.dll

opencv_contrib243.dll

opencv_core243.dll

opencv_features2d243.dll

opencv_ffmpeg243.dll

opencv_flann243.dll

opencv_gpu243.dll

opencv_highgui243.dll

opencv_imgproc243.dll

opencv_legacy243.dll

opencv_ml243.dll

opencv_nonfree243.dll

opencv_objdetect243.dll

opencv_photo243.dll

opencv_stitching243.dll

opencv_ts243.dll

opencv_video243.dll

opencv_videostab243.dll

SceneRec.exe

SurfaceTrainer.exe

3 工程列表

(1)识别主界面

deviceReader

(2)训练主界面

SurfaceTrainer

(3)字符集分割及单一字串识别

ImageSeg

(4)机器授权 done

hardwareID

(5)判断机器授权的函数checkDecript的dll工程

decriptDll

该dll工程生成的库

DecriptDllRelease

(6)表类型判别程序

SceneRec

(7)读数框定位程序

flannLocate

4 识别系统所用技术说明

4.1 表类型识别模块

SceneRec.exe――根据images文件夹下面的设备名的目录下面的destination.jpg检测当前摄像头获取的图像里面最有可能是哪个表, 采用SURF特征匹配。

4.1.1 程序用法

SceneRec

程序使用模式选项: 1 ―> 训练模式; 2 ―> 识别模式

在训练模式下, 此选项指抓取的待训练表图像所在目录的全路径; 在识别模式下, 该选项是待识别图像的全路径.

例子:

训练

SceneRec 1 C:\Users\ewuumeg\images\DT890B

DT890B目录下应至少存有一个名为“1.jpg”的完整的DT890B的表图像在应用程序的部署阶段, images目录应与SceneRec.exe在同一目录下识别SceneRec 2 C:\Users\ewuumeg\select\select.jpg

在应用程序的部署阶段, select目录应与SceneRec.exe在同一目录下

4.1.2 程序详细设计

该程序内部的训练的详细逻辑:

1) 采用canny算子提取canny边缘图

2) 计算canny边缘图竖向投影直方图H

3) 统计该直方图的均值a

4) 从左扫描直方图H, 第一个大于均值a的直方图H的索引就是表的左边界l_e

5) 从右扫描直方图H, 第一个大于均值a的直方图H的索引就是表的右边界r_e

6) 在左右边界确定的竖条内, 计算canny边缘图横向投影V

7) 统计该直方图均值b

8) 从上到下扫描直方图V, 第一个大于均值b的直方图V的索引就是表的上边界t_e

9) 表的下边界b_e就是图像下边界height-1

10) (l_e, r_e, t_e, b_e)圈出的感兴趣区域就是该表, 将其存为图像destination.jpg, 与表的源图像在同一目录, 例如C:\Users\ewuumeg\images\DT890B\destination.jpg

注:由于没有提取表的下边界, 所以下边界最好尽量位于视野的下边缘

该程序内部的识别的详细逻辑:

读取SceneRec.exe同目录下images目录下面的设备列表文件devicelist.dat和设备数目文件deviceidCount.dat

根据设备列表, 遍历各个设备目录下面的destination.jpg, 提取其SURF特征值集合, 在目标图像select.jpg中寻找最佳匹配点, 每种表都有一个最佳匹配点集good_matches, 根据该匹配点集的距离测度值决定select.jpg属于哪种表. 表类型识别结果字符串写入images文件夹下面的_TEST/deviceType.res文件

源代码内部函数调用逻辑

4.2 自动定位读数框模块

flannLocate.exe――根据images文件夹下面的由SceneRec.exe检测出的设备名对应的目录下面的object.jpg, 在当前图中对应的匹配位置, 采用的是SURF特征集、相似区域匹配、摄像头参数标定技术, 该三种技术都是标准的openCV调用。

源代码内部函数调用逻辑简单.

4.3 分割识别字符串&表字符集提取模块

ImageSeg.exe――对抓到的字符串图片进行分割识别, 主要用到直方图均衡化、自适应定界法结合otsu定界法进行二值化、 二值化图片的垂直投影直方图进行字符倾斜校正和字符分割、采用矩特征进行模板匹配来识别最终字符。该程序还用于分割设备字符集的模板图片。

deviceReader.exe――抓设备图片用于训练表盘特征; 识别程序入口。调用上面三个底层程序完成最终任务。

SurfaceTrainer.exe――训练设备参数和划定设备表面特征明显区域用于识别表类型, 并且划定读数盘区域的程序。

注: 以上系统的使用方法参见”图像识别模块使用说明书_v1.0.doc”

图2

5 Dll版本程序设计

5.1 Dll的详细设计图如图2

decriptDll.dll---------> 对其他dll函数进行权限验证的dll, 只能由hardwareID.exe在目标机器上运行生成授权文件才能在目标机器上使用以上dll.

5.2 Dll函数接口(ImageRecUtilities)的设计如下

①抓帧函数, 返回对象---- 当前帧

utilities_queryOneFrame()------>utility_currentImage

②保存某类型表的样本图片以供训练

utilities_initSave() ------>打开摄像头

utilities_setSaveTypeStr() ------>设置要保存样本图片的表类型名

utilities_saveTypeImage() ------->保存样本图片(例如images/DT890B/1.jpg)

utilities_finishSave() ------->关闭摄像头

③表类型识别函数, 返回对象----表类型字符串

utilities_initSave() ------>打开摄像头

utilities_doTypeRec() --------> utility_typeStr

④表类型重置函数, 返回对象----表类型字符串

⑤数字串定位函数, 返回对象---表原始框和读数框

utilities_doLocatation() ------> utility_num_rectArray

------> utility_srcRect

------> utility_desRect

⑥识别函数, 返回对象----数字串个数

utilities_doNumRec() -----> utility_num_string_boxCount

场景:

①为训练程序进行抓图的场景

utilities_initSave()

utilities_setSaveTypeStr()

for i=0,…,23

utilities_queryOneFrame()

utilities_saveTypeImage()

end for

utilities_finishSave()

②进行识别

utilities_initSave()

utilities_queryOneFrame()

utilities_doTypeRec()

utilities_doLocatation()

do

utilities_queryOneFrame()

int num = utilities_doNumRec()

for int j=0,…,num-1 //get the result

StringBuilder a = new StringBuilder(“a”, 256);

a.Capacity = 256;

utilities_getOneResult(a, j);

end for

while …

utilities_finishSave()

③在场景2开始后重设表类型然后进行识别

utilities_finishSave()

utilities_initSave()

utilities_resetDeviceType()

utilities_doLocatation()

do

utilities_queryOneFrame()

int num = utilities_doNumRec()

for int j=0,…,num-1 //get the result

StringBuilder a = new StringBuilder(“a”, 256);

a.Capacity = 256;

utilities_getOneResult(a, j);

end for

while …

utilities_finishSave()

5.3 Dll VS工程

因为C#与VB调用要求Dll接口封装的方式不同, 所以提供两个不同的Dll VS工程

ImageRecUtilities -------供C#调用的Dll接口工程

ImageRecUtilitiesC-------供VB调用的Dll接口工程

5.4 Dll VS支撑工程

支撑工程生成的Dll仅供上面的ImageRecUtilities调用, 所以只提供VC调用的接口。

decriptDll -------提供查看当前机器授权的dll

/*if (!isComInitialized){*/

// 初始化COM

hres = CoInitializeEx( NULL, COINIT_MULTITHREADED );

if( FAILED(hres) )

{

//printf(" failed 1\n");

return -2;

}

// 设置COM的安全认证级别

hres = CoInitializeSecurity(

NULL,

-1,

NULL,

NULL,

RPC_C_AUTHN_LEVEL_DEFAULT,

RPC_C_IMP_LEVEL_IMPERSONATE,

NULL,

EOAC_NONE,

NULL

);

if( FAILED(hres) )

{

//printf(" failed 2\n");

CoUninitialize();

return -2;

}

isComInitialized = true;

/*}*/

>

SceneRec ---------提供表类型识别的dll

flannLocate ------提供根据表类型识别结果定位读数框的dll

ImageSeg ---------提供字符串图片分割识别的dll

5.5 Dll函数的调用例子工程为

C#命令行工程:

CSharpDll_SaveImage -------给表抓训练图(images//1.jpg, …)的例子

CSharpDll_Rec -------表盘特征训练完成, OCR字符模板训练完成后的识别调用的例子

VB命令行工程:

VBDll_SaveImage -------给表抓训练图(images//1.jpg, …)的例子

VBDll_Rec -------表盘特征训练完成, OCR字符模板训练完成后的识别调用的例子

图3

具体生成的软件界面如下,经实际使用,本程序可实现对风量罩显示数据的正确读取和识别,对其他显示屏的显示数据的自动识别也有相应的借鉴作用。

上一篇:炼胶生产线气动机械手的优化设计 下一篇:地方应用型本科院校实验室效益评估机制研究