|
【小程序碼-設(shè)計(jì)篇】菊花綻放 一文中介紹了小程序碼的設(shè)計(jì)過(guò)程,本文繼續(xù)分享我們?cè)谛〕绦虼a識(shí)別上面的一些心得,權(quán)當(dāng)拋磚引玉,歡迎有共同興趣的同事一起討論。 識(shí)別之前,我們需要對(duì)照片做什么處理打開(kāi)掃一掃,掃碼引擎通常采集到的圖片是這樣子的。
引擎其實(shí)并不關(guān)心這朵菊花是什么顏色,因此,我們把圖片簡(jiǎn)化,處理成灰度圖。
二值化可以讓引擎做的事情更簡(jiǎn)單,因此再將灰度圖處理成位圖。
如何在黑白圖中快速找到菊花的位置細(xì)心的朋友肯定注意到,每一朵菊花都有兩個(gè)共同點(diǎn):
以上是小程序碼的定位信息,準(zhǔn)確的定位是識(shí)別的第一步。 如何快速找出所有可能的定位點(diǎn) 在設(shè)計(jì)這個(gè)菊花碼時(shí),我們是按照 0.8 : 1.2 : 1 : 1.2 : 0.8 繪制定位點(diǎn)的。
為什么不采用 1:1:1:1:1 的比例?因?yàn)榍罢弑壤容^貼近黃金比例,更符合人類審美需求。(下圖右為 1:1:1:1:1)
基于這個(gè)特性,使用水平,垂直,45 度角等三個(gè)方向的掃描線掃描全圖。如果三個(gè)方向的黑白像素都接近這個(gè)比例,顯然它極可能是一個(gè)定位點(diǎn)。
怎么定位“小程序 LOGO” 最簡(jiǎn)單的方法,根據(jù) 3 個(gè)定位點(diǎn)的位置,預(yù)估小程序 LOGO 的中心位置(平行四邊形)
在很多扭曲的情況下,上述方法仍有較大偏差。因此我們提出了一種改進(jìn)方法:基于 LOGO 為圓形的特性,將預(yù)估的中心點(diǎn)修正到圓心位置
具體校正方法如下:
拍攝出來(lái)的碼這么“歪”,能否進(jìn)行“擺正”由于上文中,我們已經(jīng)找到了碼在圖像中的位置,但由于這個(gè)碼可能已經(jīng)被旋轉(zhuǎn),扭曲,所以,我們需要再做一次矩陣變換(透視變換),將其變換到直角坐標(biāo)系。變換后的碼,已經(jīng)比較易于被機(jī)器解讀了。
怎么讀碼二維碼怎么讀碼 上述流程和傳統(tǒng)二維碼識(shí)別的核心思想并無(wú)二致,如果你堅(jiān)持看到這里,說(shuō)明你已經(jīng)知道如何識(shí)別二維碼了。
經(jīng)過(guò)透視變換,二維碼其實(shí)已經(jīng)變成了單位矩陣(如上圖,你可以理解一個(gè)小塊為一個(gè)像素點(diǎn),這里為了方便閱讀,放大了),那么,我們順著二維碼的編碼路徑,就能完整地讀出編碼信息了。 小程序碼怎么讀碼 其實(shí),按照二維碼的套路,我們可以把透視變換后的圖,進(jìn)行編碼區(qū)域劃分。值得注意的是,這里一個(gè)彩色小塊并非一個(gè)像素點(diǎn),而是一片區(qū)域。一個(gè)編碼塊是 0 還是 1,取決于該區(qū)域上的黑色像素(面積)的比例,我們稱之為“投票法”。
是否有其他讀碼方案但在實(shí)際應(yīng)用中,我們發(fā)現(xiàn)該方法對(duì)于扭曲的場(chǎng)景,識(shí)別效率很低,魯棒性不佳。經(jīng)過(guò)各種嘗試和思考,我們借鑒了一維碼的識(shí)別思路 ——“采樣法”。
舉個(gè)例子,上圖中,我們用紅色掃描線采樣一維碼的信息,對(duì)于采樣的一行像素,我們根據(jù)比例讀出具體的編碼。
類比該方案,我們利用小程序碼為“放射線”編碼的特性,采樣每一條放射線上的一個(gè)像素序列,根據(jù)黑白比例讀出每一條線的編碼信息。 目前掃碼引擎的性能如何,能應(yīng)對(duì)什么場(chǎng)景在測(cè)試階段,我們內(nèi)部自行拍攝采集了各種場(chǎng)景下的大量測(cè)試樣本,做了如下評(píng)測(cè)
包括如下場(chǎng)景
|