八 Halcon学习笔记——OCR初步创建并训练OCR分类器

这一部分我们主要利用的例程进行分析,这个例程展示了怎样实现一个简单的OCR分类器,下面进行逐句解读 。
首先我们要创建一个分类器是用于训练的,按照训练的思路,第一步就是要有训练字符,第二步是要知道训练字符的标签,第三步才是进行训练 。下面我们一步一步来实现 。
第一步:读取图片和显示图片,并获取图片参数,主要是长和宽,这里image (Image, 0, 0, -1, -1, )表示打开一个适应图像尺寸的窗口,并设置颜色,获取图片路径之后定义训练文件名 。
* This example program shows how to use a simple MLP OCR classifier*dev_update_off ()read_image (Image, 'letters')get_image_size (Image, Width, Height)dev_close_window ()dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)dev_set_colored (12)set_display_font (WindowHandle, 16, 'mono', 'true', 'false')get_tmp_dir (TmpDir)TrainFile := TmpDir + '/letters.trf'dev_display (Image)
执行这一段代码之后得到
第二步:形成训练数据 。
生成一个矩形区域,并与原图做差,即从原图中分割出这个区域的内容作为训练数据
【八Halcon学习笔记——OCR初步创建并训练OCR分类器】gen_rectangle1 (Rectangle, 0, 0, Height - 1, 400)reduce_domain (Image, Rectangle, Image)* Segment the image
接着执行这一段代码得到以下内容,即从原图中分割出该矩形区域的内容 。
第三步:对训练数据分割并排序
加下来对分割下来的部分进行处理 。首先进行快速二值化,(快速二值化一般用于背景简单的内容)需要注意的是,快速二值化的参数dark表示需要处理的部分为黑色 。由于字母i和j为两个部分组成,所以需要先进行膨胀,使其成为一个连通域之后再进行打散操作,然后通过求交集的方式,将膨胀后的字母还原成原来的大小 。注意,在求交集运算中,即使最终i和j上的点没有与下面连接,依然是一个连通域,打散之后进行排序操作,这里选用按字符行排列 。
binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold)* Connect the i's and j's with their dotsdilation_circle (Region, RegionDilation, 3.5)* Compute the correct connected componentsconnection (RegionDilation, ConnectedRegions)* Reduce each connected component (character) to its original shapeintersection (ConnectedRegions, Region, RegionIntersection)* Sort the characters line-by-linesort_region (RegionIntersection, Characters, 'character', 'true', 'row')dev_display (Characters)disp_message (WindowHandle, 'Training characters', 'window', 12, 12, 'black', 'true')disp_continue_message (WindowHandle, 'black', 'true')stop ()
运行以上代码得到
第四步:建立图片字符与理论字符的关联文件
先计算字符个数、训练数据每一行的长度,定义数组,用于存储字母a ~ .,ord('a') + j表示将a转成ASCII编码后加j表示其他字母的ASCII编码,chr(ord('a') + J))表示将ASCII编码转化为字符,(,chr(ord('a') + J))表示生成长的该字符tuple,(, Image, , )表示将Image中的训练字符与一一关联,存储在文件中 。
* Compute the true class of each charactercount_obj (Characters, Number)Length := Number / 27Classes := []for J := 0 to 25 by 1Classes := [Classes,gen_tuple_const(Length,chr(ord('a') + J))]endforClasses := [Classes,gen_tuple_const(Length,'.')]* Construct the necessary training file from the segmented characterswrite_ocr_trainf (Characters, Image, Classes, TrainFile)
执行得到数组的内容
至此,数组与图片中的字符建立关联,关联文件为 。可以借助OCR训练文件浏览器查看,这里在汉字识别部分会进行补充 。