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以上的版本

posted on 2025-06-13 10:17  江渔湖  阅读(263)  评论(0)    收藏  举报