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