共用方式為


現場筆記高容量彩色條碼

Gavin Jancke

對我們來說,條碼實在是再熟悉不過的東西了,熟悉到幾乎忘了它的存在 — 從食品包裝到送貨標籤,它在我們日常生活當中幾乎無所不在。最初的條碼是 1974 年用於零售業的 1D 條碼,它結合了各種不同寬度的垂直線條,並且儲存了一個 12 位數的數字。條碼隨著運算能力的增長而逐步發展,到了 80 年代末期的黑白 2D 條碼 (矩陣條碼),其資料密度已從僅僅幾個位數,一躍而為數百個位元組。

2003 年我接下 Microsoft Research 的專案,開始研究防仿冒的人體辨識卡。我需要儲存的不只是密碼編譯文字 (例如名稱和年齡),還有指紋或虹膜範本。如果要以現有的黑白條碼儲存所有必要的資料,條碼本身就會大過識別卡,因此非得另覓途徑不可。

根據黑白 2D 條碼的標準,我必須判定如何在每一個符號儲存一位元以上的資訊。如果以彩色代替黑白,就可以使用四種和八種顏色,分別提升到兩個或三個位元的資料。

另外,我也以符號形狀進行實驗,看看它們是否能夠更緊密的包裝在一起,而不會在掃描時損及它們的註冊。一開始我覺得六邊形似乎不錯,但是這些形狀會全部混在一起,致使電腦無法清楚辨識。

最後我選擇三角形,因為它們在壓縮空間當中可以整齊交叉,卻又能保有清楚的識別形狀。如果使用成列的多色三角形,還可以將密度上限提升到 3D。

janke.fieldnotes.gif

不過它必須對抗許多變數。使用色彩所要面對的最大挑戰之一,是列印規格和光源狀況的變化。對於人眼來說,辨識顏色是輕而易舉的事 (只要不是色盲都做得到),但是對於電腦來說就不是那麼容易了。

我用了幾種不同的方法,確保軟體能夠精確讀取顏色。我在條碼中建立一個極其微小,小到幾乎不會注意到的調色盤,其中含有存在於真正條碼中的參考顏色。這個做法會提供一種校準機制,比方說,可以精確指定哪些顏色會構成某種特定的紅色。另外我也試了幾種更進階的技術,例如自訂和輕量型的顏色叢集演算法,利用顏色空間理論,將顏色分類成組。這兩種方法都同樣好用,而且還能彼此互補。

我為這個專案所訂的其中一個目標,是編寫一個可以讓手機讀取條碼的程式。使用手機時,必須考慮光源不足和焦點失調、固定焦距鏡頭等問題。而且,要在以整數為單位、慢如牛步的手機 CPU 上完成所有的電腦視覺,更是一大挑戰,因此小組必須建構一個牢靠的理論,不但能夠偵測影像中的條碼,同時又能儘量減少接觸像素。掃描必須在一個讀取品質範圍內進行,例如,較高亮度的聚焦 LCD 面板到較低亮度的失焦實體印本。

最終演算法對於即時攝影機視訊畫面上的條碼影像的解碼速度,比實際的畫面播放速率更快 — 在 200Mhz CPU 上大約 10 毫秒。在影像當中,條碼能夠容納最小資料裝載,而且仍然能夠偵測的最少像素,大約是 45 個像素的正方形。

為了能夠在多變的條件下完成這項工作,我前後花了兩年多的時間加以試驗改良。這項技術最近已經授權給協力廠商,後半年還會推出一些刺激好玩的應用方式。

Gavin Jancke 是 Microsoft Research 的工程總監,負責帶領進階開發小組與網路體驗小組。之前他曾擔任產品支援工程師、SQL Server 軟體工程師,以及比爾蓋茲的技術諮詢執行工作人員。