字符分割和识别
字符识别(OCR)是在图像中识别字符的过程。主要包括 在图像中的单个字符分割出来,将分割出来的字符进行分类两个部分。
实例:
dev_update_window ('off')
read_image (Image, 'printer_chip/printer_chip_01')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_display (Image)
disp_continue_message (WindowHandle, 'black', 'true')
*全局阈值处理获得区域
threshold (Image, Region, 100,255)
*根据形状填充孔洞
fill_up_shape (Region, RegionFillUp, 'area', 1, 100)
*利用圆形结构进行开运算
opening_circle (RegionFillUp, RegionOpening, 3.5)
dev_display (Image)
*填充区域孔洞
fill_up (RegionOpening, RegionFillUp1)
*利用矩形结构元素执行开运算
opening_rectangle1 (RegionFillUp1, RegionOpening1, 1,7)
*计算连通区域
connection (RegionOpening1, ConnectedRegions)
*计算区域交集
intersection (RegionOpening, ConnectedRegions, RegionIntersection)
*根据区域面积进行选择
select_shape (RegionIntersection, SelectedRegions, 'area', 'and', 150, 99999)
*区域排序
sort_region (SelectedRegions, SortedRegions, 'first_point', 'true', 'column')
*读取数字
read_ocr_class_mlp ('C:/Users/Public/Documents/MVTec/HALCON-17.12-Progress/examples/hdevelop/Applications/OCR/bottle.omc', OCRHandle)
*使用分类器进行字符分类
do_ocr_multi_class_mlp (SortedRegions, Image, OCRHandle, Class, Confidence)
*清楚分类器
clear_ocr_class_mlp (OCRHandle)
dev_update_window ('on')
条形码识别
1.一维条形码识别算子
创建一维条形码模型:
creat_bar_code_model(::genparamnames条形码模型可调整的参数名称,genparamvalues调整条形码模型所用参数的值:barcodehandle条形码句柄,代表条形码模型有关算子)
设置条形码参数:
set_bar_code_param(::barcodehandle条形码句柄,genparamnames,genparamvalues调整条形码模型所用参数的值)
genparamvalues:
- ‘element_size_min’:条形码宽度的最小尺寸,指条形码的宽度和间距
- ‘element_size_max’:条形码宽度的最大尺寸
- ‘check_char’:是否验证校验位
- ‘persistence’:设为1时,在解码过程中会储存一些中间结果,当需要评估条码印刷质量或检查扫描线时会用到这些结果
- ‘composite_code’:EAN,UPC等码都可以附加一个二维条码构成组合码
- ‘meas_thresh’:当使用扫描线来识别条形码的边缘时,作为相对阈值来识别这些边缘,这个阈值是一个相对值
- ‘num_scanlines’:扫描条码时所用扫描线的最大数目,设为0,程序会自动决定采用多少条扫描线来解码
- ‘min_identical_scanlines’:认定成功解码所需的最少扫描线数
- ‘start_stop_tolerance’:当检测扫描线的起点和终点图案时,用该语句设置允许误差
- ‘orientation’:条码的方向
- ‘orientation_tol’:方向的容差
- ‘manx_diff_orient’:设置相邻边缘方向的最大角度容差
- ‘element_height_min’:条码的最小高度
- ‘stop_after_result_num’:设置要解码的条码数目
检测并读取图像中的一维条形码:
find_bar_code(image待处理图像:symbolregion存储对应条码所在区域:barcodehandle一维条形码模型句柄,codetype一维条形码类型:decodedatastrings解码结果存储在此字符串数组中)
获取解读条形码标识时计算得到的字母数字结果;
get_bar_code_result(::barcodehandle条形码模型的句柄,candidatehandle指定需要查询的条形码解码结果的索引值或者选择查询所有的结果,resultname返回的结果数据的名称:barcoderesults得到的结果列表)
访问在搜索条形码或解码期间创建的图标对象:
get_bar_code_object(candidates,barcode-handle,‘all’,‘candidate_regions’)
删除条形码模型并释放分配的内存:
clear_bar_code_model(::barcodehandle)
2.二维条形码识别算子
在一幅图像中检测并读取二维数据码标识或者在训练二维数据条形码模型:
find_data_code_2d(image输入图像:symbolXLDs被成功解码的二维条码周边XLD轮廓:datacodehandle二维条码模型句柄,genparamnames可设置的参数名称,genparamvalues设置的参数对应的参数值:resulthandles所有成功解码的二维数据码的句柄,decodeddatastrings在图像中搜索到的二维码解码字符结果)
3.三维模型匹配算子
从文件中读取一个3D形状模型:
read_shape_model_3d(::filename读取文件的文件名:shapemodelDID3D形状模型句柄)
从文件filename中读取一个3d对象模型,同时返回一个对象句柄:
read_object_model_3d(::filename读取的3d对象模型的文件名,scale文件中数据单位的缩放比例,genparamname算子中通用参数名,genparamvalue算子中通用参数值:objectmodel3d 3d对象模型句柄,status对象模型状态信息)
为某个操作准备一个3d对象模型:
prepare_object_model_3d(::objectmodel3d 3d对象模型句柄,purpose创建3d对象模型的目的,overwritedata指定是否覆盖现有数据,genparamname函数可设置参数名,genparamvalue设置的参数对应的值)
在一幅图像中寻找一个3d形状模型的最佳匹配:
find_shape_model_3d(image输入图像::shapemodel3DID 3d形状模型句柄,minscore找到的模型实例的最小匹配分数,greediness决定何种方式进行启发式“贪婪”算法搜索,numlevels匹配时所用金字塔层数,genparamnames算子可设置的参数名称,genparamvalues算子设置的对应的参数的值:pose 3d形状匹配的3d位资,covpose位资参数的6个标准偏差或36个协方差参数,score匹配得到的3d形状模型的分数)
释放3d形状模型所占内存:
clear_shape_model_3d(::shapemodel3DID 3D形状模型句柄:)
4.基于表面三维匹配算子
将对应的3d点图像转换为3d对象模型:
xyz_to_object_model_3d(X 包括3d点x坐标和对应的roi区域的图像,Y具有3d点的y坐标的图像,Z具有3d点的z坐标的图像:::objectmodel3d 对象模型句柄)
创建完成一个基于表面3d模型匹配所需的数据结构:
creat_surface_model(::objectmodel3d 对象模型句柄,relsamplingdistance取样距离与对象模型直径的比值,genparamname可设置的参数名称,genparamvalue设置的参数对应的值:surfacemodelID表面模型的句柄)
交互显示3d对象模型:
visualize_object_mode_3d(::windowhandle窗口句柄,objectmodel3d 3d对象模型的句柄,camparam拍摄图像场景的摄像机参数,posein 对象的3d位资,genparamname 可设置的参数名,genparamvalue 设置参数对应的值,title要显示在输出图形窗口左上角的文本,label要显示在每个显示对象模型的位置的文本,information要显示在输出图形窗口左下角的文本:poseout可能由用户交互式更改的所有对象模型的姿势)
在对应的3d场景中进行一个基于表面模型的三维匹配:
find_surface_model(::surfacemodelID表面模型句柄,objectmodel3d待搜索场景的句柄,relsamplingdistance取样距离与对象模型直径的比值,keypointfraction采样的场景点中作为关键点的比例,minscore过滤匹配结果的匹配分数值,returnresulthandle是否返回匹配结果的句柄,genparamname用于控制匹配过程的参数的名称,genparamvalue已选择的用于控制匹配过程参数的值:pose表面模型在场景中的3d位资,score在场景中搜索到的表面模型实例的匹配分数,surfacematchingreasultID如果匹配成功,则此变量为匹配结果的句柄)
获取表面匹配结果的详细信息:
get_surface_matching_result(::surfacematchingresultID表面匹配结果的句柄,resultname匹配结果对应的属性名,resultindex匹配结果的索引:resultvalue匹配结果属性的值)
释放表面模板匹配得到的结果所占的内存:
clear_surface_matching_result(::surfacematchingresultID表面模型匹配结果的句柄:)
释放表面模型的内存:
clear_surface_model(::surfacemodelID表面模型的句柄:)
图像拼接
使用foerstner算子检测特征点:
points_foerstner(image输入图像::sigmagrad用于计算梯度的平滑量,sigmaint用于梯度积分的平滑量,sigmapoints在优化功能中使用的平滑量,threshinhom用于不均匀图像区域分割的阈值,threshshape点区域分割阈值,smoothing使用的平滑方法,eliminatedoublets是否设置消除多重检测点:rowjunctions,columnjunctions检测到特征点的行列坐标,corrjunctions检测到的特征点的协方差矩阵的行部分,corcjunctions检测到特征点的协方差矩阵的混合部分,coccjunctions检测到特征点的协方差矩阵的列部分,rowarea,columnarea检测到的区域点的行列坐标,corrarea检测到区域点的协方差矩阵的行部分,corcarea检测到区域点的协方差矩阵的混合部分,coccarea检测到区域点的协方差矩阵的列部分)
通过两张图像中的对应点计算投影变换矩阵:
proj_match_points_ransac(image1,image2两张输入图像,::rows1,cols1图像1中特征点的行列坐标,rows2,cols2图像2中特征点的行列坐标,graymatchmethod灰度值比较指标,masksize灰度值掩膜大小,rowmove,colmove平均行列坐标移位,rowtolerance匹配搜索窗口的高度值的一半,coltolerance匹配搜索窗口的宽度的一半,rotation旋转角度的范围,matchthreshold进行灰度值匹配时的阈值,estimationmethod变换矩阵估计算法,distancethreshold变换一致性检查时的阈值,randseed随机数发生器的种子:hommat2d计算得到的同质投影变换矩阵,points1,points2图像1,2中输入点匹配时的指标)
将多张子图像拼接为一张图像:
gen_projective_mosaic(images拼接过程输入的子图像:mosaicimage拼接得到的结果图像:startimage确定最终图像平面对应图像的索引,mappingsource转换源图像的指标,mappingdest转换目标图像的指标,hommatrices2d3*3投影变换矩阵,stackingorder各子图像在拼接图像中的堆叠顺序,transformdomain判断输入图像的域是否应该被转换:mosaicmatrices2d决定各子图像在拼接后图像中位置的3*3投影变换矩阵)
本文是HALCON学习笔记的第八篇,主要探讨了字符分割和识别,尤其是条形码识别算子的使用,包括一维和二维条形码的创建、检测和解码。此外,还介绍了三维模型匹配算子和基于表面三维匹配的操作,最后提到了图像拼接的过程。
——HALCON相关实例和算法&spm=1001.2101.3001.5002&articleId=116144223&d=1&t=3&u=3467dc0a50454a1d8a1680cbbf7e61d4)
6564

被折叠的 条评论
为什么被折叠?



