机器视觉中提升解码成功率的思路分析

以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从新设置新的解码参数的思路来提升解码成功率。

相关文章
相关标签/搜索