halcon简易识别酒瓶上的特定字符

By admin at 2019-10-02 • 0人收藏 • 2549人看过
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="Button";left=636;top=53;right=750;bottom=152;z=2};
picturebox={cls="picturebox";left=0;top=0;right=588;bottom=470;z=1}
)
/*}}*/

import HOperatorSetX;
//halcon
var HOperatorSetX = com.CreateObject("{6ebd90e2-d219-11d2-ade5-0000c00f4ef9}")
//读取图片
var Bottle = HOperatorSetX.ReadImage("C:\Users\Public\Documents\MVTec\HALCON-13.0\examples\images\bottle2");
//读取图片原始大小
var Width, Height = HOperatorSetX.GetImageSize(Bottle);
//将picturebox绑定到halcon窗口,并设置窗口显示图片原始大小
var WindowHandle = HOperatorSetX.OpenWindow(0,0,Width, Height,winform.picturebox.hwnd,"transparent","");

import console
console.open()

winform.button.oncommand = function(id,event){
    //Halcon所提供的OCR分类器,都是基于“白底黑字”的情况来进行文本训练的
    
    //设置ocr字体
	var FontName = 'Universal_0-9_NoRej'
	
	//创建文本查找模式为自动配置
	var  TextModel = HOperatorSetX.CreateTextModelReader( 'auto', FontName );
	//追加字体模型参数,限制宽度为6
	HOperatorSetX.SetTextModelParam( TextModel, 'min_stroke_width', 6 );
	//追加字符已知结构:[2个字符] [2个字符] [2个字符]
	HOperatorSetX.SetTextModelParam( TextModel, 'text_line_structure', '2 2 2' );
	//识别字符
	var  TextResultID = HOperatorSetX.FindText( Bottle, TextModel );
	//获取识别结果, 返回所有识别到的块
	var Characters = HOperatorSetX.GetTextObject(  TextResultID, 'all_lines' );
	HOperatorSetX.DispObj( Bottle , WindowHandle );
	HOperatorSetX.DispObj( Characters , WindowHandle );
	
	//显示文字结果
	var  Classes = HOperatorSetX.GetTextResult( TextResultID, 'class' );
	console.dump(Classes)
	//释放
	HOperatorSetX.ClearTextResult( TextResultID );
	HOperatorSetX.ClearTextModel( TextModel );
}

winform.show();
win.loopMessage();
return winform;

image.png

注意: Halcon所提供的OCR分类器,都是基于“白底黑字”的情况来进行文本训练的


在Halcon案例中,对于OCR的识别主要分为以下几个步骤。

第1步:读图,提取需要识别区域

第2步:创建文本模型并设置参数

第3步:查找文本行

第4步:通过MLP分类进行OCR字符识别

第5步:清除MLP分类模型


对于第2步,我们的主要步骤如下


首先我们通过create_text_model_reader来创建一个TextModel,其是用来描述、限制find_text需要分割的文本。其中Mode的参数值决定了使用哪种文本分割方法。


查找方式有两种,"auto"和"manual"。


1)、通常我们会使用"auto",因为这样会比较稳定,使得配置工作大大减少。这种模式下find_text能够提取任意大小的文本,当然如若需要限制,可通过set_text_model_param来设置搜索限制,减少错误发生。


2)、"manual"模式通常在以下情况下需要使用:


1、所需分割文本字符是点阵的;


2、背景与字符之间存在局部极性变化的文本;


3、没有合适的基于基于MLP的OCR分类器;


在这模式下,必须使用set_text_model_param设置文本模型的合理参数,如字符的高度、宽度,也可以使用get_text_model_param来查询TextModel的参数。


而无论是“auto”还是“manual”,create_text_model_reader都有一个OCRClassifierMLP,如果在"auto"情况下,必须要有传递OCR的分类,是什么字体类型,而"manual”则为【】空便可。


原文链接:https://blog.csdn.net/lenole320/article/details/77372603




登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...