
作者:ChildZed
预估稿费:400RMB(不服你也来投稿啊!)
投稿方式:发送邮件至linweiinclude""include""include""include"opencv2/"usingnamespacecv;int_tmain(intargc,_TCHAR*argv[]){Matsrc=imread("");imshow("Raw",src);inti,j;for(j=0;;j++)for(i=0;;i++){if(i==3||i==6||i==10||i==14||i==17||i==21||i==24||i==28||i==31||i==35||i==39||i==42||i==46||i==49||i==53||i==56||i==60||i==63||i==67||i==71||i==74||i==78||i==81||i==85||i==89||i==92||i==96){(i,j)[0]=(i-1,j)[0];(i,j)[1]=(i-1,j)[1];(i,j)[2]=(i-1,j)[2];}if(i==7||i==18||i==25||i==32||i==43||i==50||i==57||i==61||i==64||i==68||i==75||i==82||i==93){(i,j)[0]=(i+1,j)[0];(i,j)[1]=(i+1,j)[1];(i,j)[2]=(i+1,j)[2];}}imwrite("",src);imshow("",src);return0;}
代码中(i,j)[0],(i,j)[1],(i,j)[2]分别代表像素点的三个RGB通道。代码的含义就是将黑线的像素点的颜色根据情况修改为其上一坐标位置或者下一坐标位置的颜色。来看看效果如何。(左边是原图,右边是处理后的图,处理后的图上还有线的原因是代码中并没有对杂色类型线条中的灰色线条进行处理,只要处理一下线条就不存在了)。

不过这也有一些缺陷,比如斜线可能会还原成锯齿。对于支付宝的工作人员可以利用这个缺陷进行一下过滤。
前面说到的是100*100像素的图片,接下来讲讲AR红包刚推出时的200*200的图片。方法基本相同,也是通过使用相邻像素颜色修改黑线颜色来实现,不同的是黑线的宽度和黑线分布的方式,只需把上述代码的处理部分修改为如下所示即可处理。
12345678910111281920212223242526272829303373839404474849505575859606162636465666768697077778if(i==5||i==55||i==105||i==155){(i,j)[0]=(i-1,j)[0];(i,j)[1]=(i-1,j)[1];(i,j)[2]=(i-1,j)[2];}if(i==48||i==97||i==148){(i,j)[0]=(i-1,j)[0];(i,j)[1]=(i-1,j)[1];(i,j)[2]=(i-1,j)[2];(i+1,j)[0]=(i-1,j)[0];(i+1,j)[1]=(i-1,j)[1];(i+1,j)[2]=(i-1,j)[2];(i+2,j)[0]=(i+4,j)[0];(i+2,j)[1]=(i+4,j)[1];(i+2,j)[2]=(i+4,j)[2];(i+3,j)[0]=(i+4,j)[0];(i+3,j)[1]=(i+4,j)[1];(i+3,j)[2]=(i+4,j)[2];}if(i5i48((i+1)%7==0)){(i,j)[0]=(i-1,j)[0];(i,j)[1]=(i-1,j)[1];(i,j)[2]=(i-1,j)[2];(i+1,j)[0]=(i-1,j)[0];(i+1,j)[1]=(i-1,j)[1];(i+1,j)[2]=(i-1,j)[2];(i+2,j)[0]=(i+3,j)[0];(i+2,j)[1]=(i+3,j)[1];(i+2,j)[2]=(i+3,j)[2];}if(i48i97i%7==0){(i,j)[0]=(i-1,j)[0];(i,j)[1]=(i-1,j)[1];(i,j)[2]=(i-1,j)[2];(i+1,j)[0]=(i-1,j)[0];(i+1,j)[1]=(i-1,j)[1];(i+1,j)[2]=(i-1,j)[2];(i+2,j)[0]=(i+3,j)[0];(i+2,j)[1]=(i+3,j)[1];(i+2,j)[2]=(i+3,j)[2];}if(i97i146((i-1)%7==0)){(i,j)[0]=(i-1,j)[0];(i,j)[1]=(i-1,j)[1];(i,j)[2]=(i-1,j)[2];(i+1,j)[0]=(i-1,j)[0];(i+1,j)[1]=(i-1,j)[1];(i+1,j)[2]=(i-1,j)[2];(i+2,j)[0]=(i+3,j)[0];(i+2,j)[1]=(i+3,j)[1];(i+2,j)[2]=(i+3,j)[2];}if(i147i()((i-2))%7==0){(i,j)[0]=(i-1,j)[0];(i,j)[1]=(i-1,j)[1];(i,j)[2]=(i-1,j)[2];(i+1,j)[0]=(i-1,j)[0];(i+1,j)[1]=(i-1,j)[1];(i+1,j)[2]=(i-1,j)[2];(i+2,j)[0]=(i+3,j)[0];(i+2,j)[1]=(i+3,j)[1];(i+2,j)[2]=(i+3,j)[2];}if(i==43||i==93||i==143||i==193){(i,j)[0]=(i+2,j)[0];(i,j)[1]=(i+2,j)[1];(i,j)[2]=(i+2,j)[2];(i+1,j)[0]=(i+2,j)[0];(i+1,j)[1]=(i+2,j)[1];(i+1,j)[2]=(i+2,j)[2];}来看看处理的效果。

后记
最后来说一下之前提到的支付宝使用100*100像素图片代替200*200像素图片存在的问题。由于后者清晰,因此容易进行PS,而前者比较模糊,PS效果不好,不过这也导致其识别效果不理想,按常理来说一个有棱有角的图片应该比一个模糊的图片容易识别的多,而图片模糊会造成识别上的误差,可能用户对实景进行扫描也没办法得到红包。因此个人认为比较好的解决方法应该是增强对于实景和图片的区别能力,毕竟叫AR红包,无法识别现实何来增强现实?