以Halcon爲例,通常解碼的步驟爲:建立解碼模型——設置解碼參數——執行解碼——清除模型回收內存。以下所示:html
1 create_bar_code_model ([], [], BarCodeHandle) 2 set_bar_code_param (BarCodeHandle, 'num_scanlines', 30) 3 find_bar_code (Image, SymbolRegions1, BarCodeHandle, ['Code 128','Code 39'], BarCodeStrings) 4 clear_bar_code_model (BarCodeHandle)
咱們通常會在「設置解碼參數」這個步驟裏面作文章。例如設置多個參數,以達到解碼成功率高且解碼速度快的目的。這個只是常規思路,我今天並不想講這個,並且這種思路有侷限:有時候不管你參數設置得多麼合理,就是死活解不出來碼。函數
不知你們有沒有這樣的體驗:生活中咱們常常用手機去掃二維碼,有時候咱們第一次掃不上,可是變更手機位置或者打開閃光燈重複掃,最終基本都能掃出來(解碼成功)。spa
我分析的緣由以下:設計
質量高的碼Halcon解碼通常僅需幾毫秒,平常生活中手機解碼若是須要一秒左右,那能夠推測其實手機是用了屢次解碼的方式,一次不成功再來一次,由於手機能夠屢次對焦曝光拍照用於解碼,而且能夠變換手機的位置來解碼。因爲單次解碼時間很短,所以就算是屢次解碼,手機掃碼看起來也像是一次性成功的。code
用Halcon解碼時,對於難解的碼咱們能夠用相似思路:一次不成,再換個解碼參數再解一次;或者改變相機曝光從新拍一張,再解一次。(變換工業相機位置拍攝不太現實,不考慮)htm
按此思路,Halcon編寫的解碼示例代碼以下:(只貼出了關鍵部分)blog
1 Length := 0 2 DecodedDataStrings := [] 3 for min_gray := 0 to 30 by 3 4 for max_gray := 255 to 180 by -7 5 *色階映射,加強圖像對比度 6 scale_gray_map (Image, Image2, min_gray, max_gray) 7 find_data_code_2d (Image2, SymbolXLDs, hv_DataCodeHandleQR, [], [], ResultHandles, DecodedDataStrings) 8 tuple_strlen (DecodedDataStrings, Length) 9 *字符串大於5應該就是解出來了,固然這裏只是簡單判斷 10 if (Length > 5) 11 break 12 endif 13 endfor 14 15 if (Length > 5) 16 break 17 endif 18 endfor 19 20 disp_message (3600, '解碼結果:' + DecodedDataStrings , 'image', 100, 12, 'black', 'true')
我設計了兩層for循環,逐漸提升圖片Image的對比度,而後在新圖Image2上解碼。圖片
注意:兩層for循環的步長不宜太小(我設計的步長分別是3和-7),否則循環的次數太多,速度太慢。內存
至於函數scale_gray_map (Image, Image2, min_gray, max_gray) 是一個根據色階映射加強圖像對比度的函數,實現方式參考:http://www.javashuo.com/article/p-xbggjchv-he.html字符串
示例代碼中是經過模擬不一樣曝光的思路提升解碼成功率,固然也能夠選擇在解不出來時經過set_data_code_2d_param從新設置新的解碼參數的思路來提升解碼成功率。