以Halcon为例,一般解码的步骤为:创建解码模型——设置解码参数——执行解码——清除模型回收内存。如下所示:

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)

 

我们一般会在“设置解码参数”这个步骤里面做文章。例如设置多个参数,以达到解码成功率高且解码速度快的目的。这个只是常规思路,我今天并不想讲这个,而且这种思路有局限:有时候无论你参数设置得多么合理,就是死活解不出来码。

 

不知大家有没有这样的体验:生活中我们经常用手机去扫二维码,有时候我们第一次扫不上,但是变动手机位置或者打开闪光灯重复扫,最终基本都能扫出来(解码成功)。

 

我分析的原因如下:

质量高的码Halcon解码一般仅需几毫秒,日常生活中手机解码如果需要一秒左右,那可以推测其实手机是用了多次解码的方式,一次不成功再来一次,因为手机可以多次对焦曝光拍照用于解码,并且可以变换手机的位置来解码。由于单次解码时间很短,因此就算是多次解码,手机扫码看起来也像是一次性成功的。


用Halcon解码时,对于难解的码我们可以用类似思路:一次不成,再换个解码参数再解一次;或者改变相机曝光重新拍一张,再解一次。(变换工业相机位置拍摄不太现实,不考虑)

 

按此思路,Halcon编写的解码示例代码如下:(只贴出了关键部分)

 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) 是一个根据色阶映射增强图像对比度的函数,实现方式参考:https://www.cnblogs.com/xh6300/p/7512532.html

 

示例代码中是通过模拟不同曝光的思路提高解码成功率,当然也可以选择在解不出来时通过set_data_code_2d_param重新设置新的解码参数的思路来提高解码成功率。

 

posted on 2018-10-18 11:58  xh6300  阅读(6449)  评论(0编辑  收藏  举报