开篇:润墨网以专业的文秘视角,为您筛选了一篇图像识别技术编程实例范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!
【摘 要】本文介绍了以风量罩作为被检器具的图像识别程序,详细阐述了其软件编写过程。
【关键词】图像识别;编程;风量罩
本文采用数字风量罩的显示屏作为图像识别的对象,对其进行智能分析、识别。其具体编程内容如下。
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
具体生成的软件界面如下,经实际使用,本程序可实现对风量罩显示数据的正确读取和识别,对其他显示屏的显示数据的自动识别也有相应的借鉴作用。