1.使用HDevlop软件编写01-TrainQRRead.hdev文件
*计数器 _index:=0 *读码超时时间 _timeOut:=1000 *读码类型 _codeType:=[] *读码数据 _codeData:=[] *已解码的区域 gen_empty_obj (_EmptyObject) *系统运行时间 _Runtime:=0 *系统编码格式 _coding:='utf8' dev_close_window () *设置系统编码 set_system ('filename_encoding', _coding) read_image (Image, '3.png') get_image_size(Image, Width, Height) dev_open_window_fit_size (0, 0, Width, Height, 640, 480, WindowHandle) *dev_open_window (0, 0, Width, Height, 'black', WindowHandle) dev_display (Image) rgb1_to_gray (Image, GrayImage) draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2) gen_rectangle1 (ROI_0, Row1, Column1, Row2, Column2) * Reduce the domain of an image reduce_domain (GrayImage, ROI_0, ImageReduced) * Cut out of defined gray values crop_domain (ImageReduced, ImagePart) _codeMode:=['QR Code','Aztec Code', 'Data Matrix ECC 200', 'GS1 Aztec Code', 'GS1 DataMatrix', 'GS1 QR Code', 'Micro QR Code', 'PDF417'] *,'Aztec Code', 'Data Matrix ECC 200', 'GS1 Aztec Code', 'GS1 DataMatrix', 'GS1 QR Code', 'Micro QR Code', 'PDF417' *stop () *创建二维码数据class模型 count_seconds (T1) for i := 0 to |_codeMode|-1 by 1 create_data_code_2d_model (_codeMode[i],[], [],DataCodeHandle) *这个参数时设置极性用的,就是防止码并非是白底黑字 set_data_code_2d_param (DataCodeHandle, 'polarity', 'any') *设置超时时间 set_data_code_2d_param (DataCodeHandle, 'timeout', _timeOut) *防止误识别设置,因为某些二维码模型没有这个属性,会报错所以try以下 try set_data_code_2d_param (DataCodeHandle, 'strict_quiet_zone', 'yes') catch (Exception) continue endtry *开始识别 find_data_code_2d (ImageReduced,SymbolXLDs,DataCodeHandle, 'stop_after_result_num',1000,ResultHandles, DecodedDataStrings) dev_display (Image) dev_display (SymbolXLDs) count_obj (SymbolXLDs, Number) PrintGrowth := [1:0.5:5] if (|ResultHandles| == 0) for Index := 0 to |PrintGrowth| - 1 by 1 * Apply print growth. * Preprossesing with gray value erosion gray_erosion_shape (ImageReduced, ImageMin, PrintGrowth[Index], PrintGrowth[Index], 'rectangle') find_data_code_2d (ImageMin, SymbolXLDs, DataCodeHandle,'stop_after_result_num',1000,ResultHandles, DecodedDataStrings) dev_display (ImageMin) flush_buffer (WindowHandle) endfor endif count_obj (SymbolXLDs, Number) if (Number) *存读码类型 for j := 1 to Number by 1 *存解码类型 _codeType[_index]:=_codeMode[i] *存解码数据 _codeData[_index]:=DecodedDataStrings[j-1] _index:=_index+1 select_obj (SymbolXLDs, ObjectSelected, j) *存二维码区域 concat_obj (_EmptyObject, ObjectSelected, _EmptyObject) *模型保存 write_data_code_2d_model (DataCodeHandle, 'data_code_model.dcm') break endfor endif *清除识别缓存 clear_data_code_2d_model(DataCodeHandle) endfor count_seconds (T2) _Runtime:=1000 * (T2-T1) dev_clear_window () dev_display (Image) dev_set_color ('green') set_display_font (WindowHandle, 12, 'mono', 'true', 'false') if (|_codeData| == 0) * Display message about the preprocessing Message := 'Data code found after adapting the image' disp_message (WindowHandle, Message, 'window', 60, 12, 'red', 'false') endif for Index := 0 to |_codeData|-1 by 1 select_obj (_EmptyObject, ObjectSelected, Index+1) dev_display (ObjectSelected) area_center_xld (ObjectSelected, Area, Row, Column, PointOrder) * Display the results TitleMessage := 'Type:'+_codeType[Index] ResultMessage := 'Data Code found in ' + _Runtime$'.1f' + ' ms' display_found_data_codes (ObjectSelected, WindowHandle, _codeData[Index],TitleMessage, ResultMessage, 'forest green', 'black') endfor stop ()
2.点击档案--输出程式选择c#可以生成C#语言的cs文件
3.执行图片加载逻辑的方法
/// <summary> /// 执行图片加载逻辑的方法 /// </summary> /// <param name="obj"></param> /// <exception cref="NotImplementedException"></exception> private void LoadImage(object obj) { //清空ROI if (_hv_Hanlde!= null) { _hv_Hanlde.ClearWindow(); XLDObject = new HObject(); DispROI = new HObject(); CodeData = null; } var fileDialog = new OpenFileDialog(); fileDialog.Filter = "打开图片|*.png;*.jpg;*.bmp"; fileDialog.DefaultExt = "*.png"; if (fileDialog.ShowDialog() == true) { // 获取打开图片路径 var fileName = fileDialog.FileName; try { // 创建一个HImage对象 var ho_image = new HImage(fileName); // 赋值给属性 DispImage = ho_image; } catch (Exception ex) { MessageBox.Show(ex.Message); } } }
4.识别二维码对应逻辑
/// <summary> /// 识别二维码对应逻辑 /// </summary> /// <param name="obj"></param> /// <exception cref="NotImplementedException"></exception> private void DiscernAction(object obj) { // 第一步:需要把二维码识别区域找出来 // 灰度化 HOperatorSet.Rgb1ToGray(DispImage, out HObject GrayImage); // 生成刚刚画ROI区域对应矩形 var roiPoint = _roi.HTuples; HObject genRoi = null; switch (_shapeType) { case ShapeType.Cricle: HOperatorSet.GenCircle(out genRoi, roiPoint[0].D, roiPoint[1].D, roiPoint[2].D); break; case ShapeType.Rectangle: HOperatorSet.GenRectangle1(out genRoi, roiPoint[0].D, roiPoint[1].D, roiPoint[2].D, roiPoint[3].D); break; } // 抠图 HOperatorSet.ReduceDomain(GrayImage, genRoi, out HObject ImageReduced); HOperatorSet.CropDomain(ImageReduced, out HObject ImagePart); // 把最终结果赋值给ROI对象 DispROI = ImagePart; // 第二步:创建对应的二维码识别模型并开始识别,显示绑定结果 // 设置编码格式 HOperatorSet.SetSystem("filename_encoding", "utf8"); // 创建二维码识别,不知道你要识别的二维码类型 // HOperatorSet.CreateDataCode2dModel(new HTuple("QR Code"), new HTuple(), new HTuple(), out HTuple CodeHandle); var codeModes = new HTuple("Aztec Code", "Data Matrix ECC 200", "DotCode", "GS1 Aztec Code", "GS1 DataMatrix", "GS1 DotCode", "GS1 QR Code", "Micro QR Code", "PDF417", "QR Code"); for (int i = 0; i < codeModes.Length; i++) { var codeMode = codeModes.TupleSelect(i); Debug.WriteLine($"codeMode={codeMode}"); // 创建二维码模型 HOperatorSet.CreateDataCode2dModel(codeMode, new HTuple(), new HTuple(), out HTuple CodeHandle); // 添加额外参数 //这个参数时设置极性用的,就是防止码并非是白底黑字 HOperatorSet.SetDataCode2dParam(CodeHandle, "polarity", "any"); //设置超时时间 HOperatorSet.SetDataCode2dParam(CodeHandle, "timeout", 1000); //防止误识别设置,因为某些二维码模型没有这个属性,会报错所以try以下 try { HOperatorSet.SetDataCode2dParam(CodeHandle, "strict_quiet_zone", "yes"); } catch (HalconException) { continue; } // 开始识别结果 HOperatorSet.FindDataCode2d(GrayImage, out HObject ho_SymbolXLDs, CodeHandle, "stop_after_result_num", 1000, out HTuple hv_ResultHandles, out HTuple hv_DecodedDataStrings); // 统计识别结果 HOperatorSet.CountObj(ho_SymbolXLDs, out HTuple hv_Number); if (hv_Number.I != 0) { HOperatorSet.SetColor(_hv_Hanlde, new HTuple("green")); // 赋值轮廓对象 XLDObject = ho_SymbolXLDs; // 赋值识别结果 CodeData = hv_DecodedDataStrings.S; break; } //清除ROI ClearROI(); } }
5.HDevlop工具下载地址https://daheng-imaging.com/downloads/softwares
6.Lince许可证下载地址
网盘:https://pan.baidu.com/s/1fbxVEE0UqaUJYMf-9pMVsQ#list/path=%2F
提取码:g3em
许可证使用方法:将license_eval_halcon_progress_2025_06.dat文件复制到软件安装目录下的License目录下,再启动HDevelop
仅支持24.11以上的版本
浙公网安备 33010602011771号