【Halcon】 二維碼識別

一、二維碼概念:

        指在一維條碼的基礎上擴展出另一維具有可讀性的條碼,使用黑白矩形圖案表示二進制數據,被設備掃描後可獲取其中所包含的信息。一維條碼的寬度記載着數據,而其長度沒有記載數據。二維條碼的長度、寬度均記載着數據。二維條碼有一維條碼沒有的“定位點”和“容錯機制”。二維條碼的種類很多,不同的機構開發出的二維條碼具有不同的結構以及編寫、讀取方法。堆疊式/行排式二維條碼,如,Code 16K、Code 49、PDF417等矩陣式二維碼,最流行莫過於QR CODE。
        它的優點有:二維碼存儲的數據量更大;可以包含數字、字符,及中文文本等混合內容;有一定的容錯性(在部分損壞以後可以正常讀取);空間利用率高等。
在這裏插入圖片描述

二、二維碼編碼過程:

1、數據分析:確定編碼的字符類型:是數字、字母、還是漢字等,然後按相應的字符集轉換成符號字符。

在這裏插入圖片描述

2、數據編碼:將數據字符轉換爲位流,每8位一個碼字,整體構成一個數據的碼字序列。其實知道這個數據碼字序列就知道了二維碼的數據內容。

例:以對數據01234567編碼爲例

①分組:012 345 67
②轉成二進制:
    012→0000001100(1* 2³+1* 2²+0* 2^0+0* 2^0)
    345→0101011001
    67 →1000011
③轉成序列:0000001100 0101011001 1000011
④字符數 轉成二進制:8→0000001000
⑤加入模式指示符(上圖數字)0001:0001 0000001000 0000001100 0101011001 1000011

        對於字母、中文、日文等只是分組的方式、模式等內容有所區別,基本方法是一致的。二維碼雖然比起一維條碼具有更強大的信息記載能力,但也是有容量限制

三、普通二維碼的基本結構:
在這裏插入圖片描述

  • 校正圖形:規格確定,校正圖形的數量和位置也就確定了;
  • 格式信息:表示改二維碼的糾錯級別,分爲L(5%)、M(15%)、Q(20%)、H(最高級別);
  • 版本信息:即二維碼的規格,QR碼符號共有40種規格的矩陣(一般爲黑白色),從21×21(版本1),到177×177(版本40),每一版本符號比前一版本 每邊增加4個模塊。
  • 數據和糾錯碼字:實際保存的二維碼信息,和糾錯碼字(用於修正二維碼損壞帶來的錯誤)。

        瞭解了二維碼的基本結構後,將探測圖形、分隔符、定位圖形、校正圖形和碼字模塊放入矩陣中,並把上面的完整序列填充到相應規格的二維碼矩陣的區域中。

四、halcon 二維碼調用算子流程:

  • 1、創建模型——create_data_code_2d_model
           參數三:適應二維模型數據的一般參數
           standard_recognition’:識別快,準確地不高
           enhanced_recognition’:識別稍慢,準確地較高
           maximum_recognition’:識別稍慢,準確地較高
           根據實際情況選擇,圖像干擾較少、背景不復雜,可選第一種識別方式
  • 2、設置參數 ——set_data_code_2d_param :參數名稱+參數值
    set_data_code_2d_param (DataCodeHandle, [‘module_size_min’,‘module_size_max’], [3,11]) 二維碼模塊之間最小距離和最大距離
    set_data_code_2d_param (DataCodeHandle, ‘module_gap’, ‘no’)
    set_data_code_2d_param (DataCodeHandle, ‘polarity’, ‘any’)極性(背景和二維碼誰暗誰亮,any表示都識別)
    set_data_code_2d_param (DataCodeHandle, ‘mirrored’, ‘no’)鏡像
    set_data_code_2d_param (DataCodeHandle, ‘contrast_min’, 20)對比度
    set_data_code_2d_param (DataCodeHandle, ‘symbol_size_min’, 19)二維碼尺寸最小值
    set_data_code_2d_param (DataCodeHandle, ‘symbol_size_max’, 143)二維碼尺寸最大值
    set_data_code_2d_param (DataCodeHandle, ‘contrast_tolerance’, ‘high’ )對比容忍度:當二維碼亮度不均勻時,可以將對比容忍度設置爲高
    set_data_code_2d_param(DataCodeHandle,‘small_modules_robustness’,‘high’)最小模塊的魯棒性,高—識別能力較強
  • 3、找到二維碼 ——find_data_code_2d
    二維碼不好辨別,不清晰時,可以試着調整參數五,增加訓練的模型參數的個數
    如:find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, ‘train’, ‘all’, ResultHandles, DecodedDataStrings)
  • 4、清除模板——clear_data_code_2d_model

注:設置參數的目的就是加上限制條件,以便更準確識別二維碼。在前三步哪一步設置都可以。要多個參數生效,加中括號,逗號隔開即可。此外獲得中間結果的算子有:get_data_code_2d_results、get_data_code_2d_objects

注意:有時候直接調用算子是識別不出二維碼的,這時候我們需要考慮細節(圖像參預處理)、參數方面的設置,比如如果找不到二維碼,可能需要增強對比度,濾波等;點狀二維碼,有時需要掩膜(將掩摸圖形用於符號的編碼區域,使得二維碼圖形中的深色和淺色(黑色和白色)區域能夠比率最優的分佈)等。

五、實戰:

dev_close_window ()
dev_open_window (0, 0, 680, 350, 'black', WindowHandle)
read_image (Image, 'C:/Users/Administrator/Desktop/圖片/1.jpg')
create_data_code_2d_model ('Data Matrix ECC 200', [], [], DataCodeHandle)
set_data_code_2d_param (DataCodeHandle, 'polarity', 'light_on_dark')
find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)
disp_message (WindowHandle, '識別結果:'+DecodedDataStrings, 'window', 12, 12, 'black', 'true')
clear_data_code_2d_model (DataCodeHandle)

在這裏插入圖片描述


總結:

        識別二維碼一般需要根據圖像的好壞來決定是否需要對它進行預處理、如何設置它的參數。以及需要了解每種參數針對圖像哪種缺陷,這樣才能通過設置參數來更好的識別二維碼。

注:如果將halcon導入MFC中顯示,還需要在顯示代碼下面加入如下代碼去除字符串兩邊的單引號。
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章