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