因爱智能

halcon学习笔记(12)——相机实践标定及二维码

最近某宝上买了一个工业相机和镜头,简单的做了一下实验;

1)相机是需要驱动的按照商家的操作安装好驱动,这样电脑才能识别到;

2)打开halcon的-助手-Image Acquisition-图像获取接口-检测-连接-点击实时即可看到相机输出;

3)标定,先打印标定板,看我前面笔记操作,具体助手-Callibration-安装选择描述文件caltab_30mm.descr-标定-图像采集助手-然后把标定板放到相机范围内-点击采集-警告级别稍微低点不然不好识别,标定前把有问题的图片删除,过程如下:


完成上面开始做了一个简单二维码识别的例子,例子是网友的,我只是加入了标定代码,复制时,记得修改标定量,不然图像会扭曲,一起学习一下,代码如下:

[plain] view plain copy

  1. * 2D Code generated by Image Acquisition 01  
  2. * QR Code  
  3. dev_close_window ()  
  4. dev_open_window (0, 0, 640, 480, 'black', WindowHandle)  
  5. *先关闭活动图形窗口,再打开这个窗口,标识符为WindowHandle;  
  6. *相对于界面左上角第0行、第0列,大小是我相机的拍照比例,颜色为黑色。  
  7. *open_framegrabber ('DirectShow', 1, 1, 0, 0, 0, 0, 'default', 8, 'gray', -1, 'false', 'default', ' Camera MV-U130RC#FACF216B-1', 0, -1, AcqHandle)  
  8. open_framegrabber ('MindVision11', 1, 1, 0, 0, 0, 0, 'progressive', 8, 'Gray', -1, 'false', 'auto', 'Camera MV-U130RC#C17D8221-3', 0, -1, AcqHandle)  
  9. *DirectShow是笔记本摄像头或者其他DirectShow的摄像头,MindVision11是我相机的摄像头;  
  10. * 注意摄像头的名称,可以用工具栏中的“助手”——打开新的Image Acquisition获取摄像头及插入代码  
  11.   
  12. grab_image_start (AcqHandle, -1)  
  13. while (true)  
  14.     grab_image_async (Image, AcqHandle, -1)  
  15.     
  16. * Calibration 01: Code generated by Calibration 01  
  17. CamParOriginal:= [0.01629,-2024.24,8.30436e-006,8.3e-006,710.402,361.975,1280,960]  
  18. CameraPose := [-0.0236413,0.0135896,0.152813,16.2821,3.05758,76.5791,0]  
  19. *上面是我相机的标定量,二维码识别时候不加也可以,halcon算法很先进,相机扭曲也可以识别二维码;  
  20.   
  21. CamParVirtualFixed:=CamParOriginal    
  22. CamParVirtualFixed[1]:=0    
  23. *上面是标定时候的参数设置  
  24.   
  25. gen_radial_distortion_map(MapFixed,CamParOriginal,CamParVirtualFixed,'bilinear')    
  26. *生产径向畸变映射图,    
  27. *mapfixed是输出,    
  28. *CamParOriginal是标定后的参数,    
  29. *CamParVirtualFixed也是输出的参数,    
  30. *'bilinear'映射类型   
  31.   
  32. map_image(Image,MapFixed,ImageRectifiedFixed)    
  33. *利用映射,消除图像畸变算子          
  34.       
  35.     create_data_code_2d_model ('QR Code', [], [], DataCodeHandle)  
  36.     * 二维码的创建开头的算子,clear为结束清除的算子,见下。  
  37.       set_display_font (WindowHandle, 16, 'mono', 'true', 'false')  
  38.       dev_set_color ('forest green')  
  39.       dev_set_draw ('margin')  
  40.       dev_set_line_width (3)  
  41.     set_data_code_2d_param (DataCodeHandle, 'default_parameters', 'enhanced_recognition')  
  42.     * 设置选定参数的二维数据模型,参数详见这个算子  
  43.     find_data_code_2d (ImageRectifiedFixed, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)  
  44.     * 检测和读取二维代码符号,也支持读取二维数据模型的序列,参数详见这个算子  
  45.       for i := 0 to |ResultHandles| - 1 by 1  
  46.         select_obj (SymbolXLDs, SymbolXLD, i+1)  
  47.         get_contour_xld (SymbolXLD, Row, Col)  
  48.         get_string_extents (WindowHandle, DecodedDataStrings[i], Ascent, Descent, TxtWidth, TxtHeight)  
  49.         disp_message (WindowHandle, DecodedDataStrings[i], 'image', max(Row-50), max([min(Col+30)-TxtWidth/2,1]), 'black', 'true')  
  50.          
  51.           
  52.         area_center_xld (SymbolXLD, Area, Row1, Column, PointOrder)  
  53.         elliptic_axis_xld (SymbolXLD, Ra, Rb, Phi)  
  54.            
  55.            
  56.         dev_set_line_width (3)    
  57.         dev_set_draw ('margin')   
  58.         dev_set_color ('blue')  
  59.         Length := 80    
  60.        disp_arrow (WindowHandle, Row1[0], Column[0], Row1[0] - Length * sin(Phi[0]), Column[0] + Length * cos(Phi[0]), 4)    
  61.        disp_message (WindowHandle, deg(Phi[0])$'3.1f' + ' deg', 'image', Row1[0], Column[0] - 100, 'black', 'false')    
  62.           
  63.       endfor  
  64.       *这段for循环语句的目的是让解码到的字符串(二维码的内容)显示到二维码深绿色(forest green上面定义)的解码区域框的行列位置。  
  65.       *disp_message (WindowHandle, DecodedDataStrings, 'window', 12, 12, 'black', 'true')  
  66.       *如果不需要设置显示到区域框中间的位置,而是显示到窗体的上方或其他位置,那么不需要上面那段for语句,只需这段信息显示的语句即可显示到窗体相应位置。  
  67.          if (|DecodedDataStrings|>0)    
  68.              disp_continue_message (WindowHandle, 'black', 'true')    
  69.              stop()  
  70.          endif  
  71.          * if语句,当解码一个(大于0,可设置多个)二维码就暂停摄像头获取图像,直至按F5.  
  72.      clear_data_code_2d_model (DataCodeHandle)  
  73. endwhile  
  74. close_framegrabber (AcqHandle)  

识别的效果如下:

评论