基于DSP的PDF417快速解碼終端的設計與實現(xiàn)
條碼方向的提取決定了膨脹運算所使用的結構體。由于對圖像直接進行膨脹運算很容易受噪聲的影響,算法首先將圖像區(qū)域分為水平、垂直、45°和135° 4種大致方向,而后提取條碼的方向并根據(jù)條碼不同的方向使用4種不同的膨脹結構體。這樣有效防止了與條碼接近的其他文字等背景由于使用各向同性的結構體進行膨脹運算而連接到條碼中。方向提取先得到圖像橫向和縱向的梯度信息,而后以適當?shù)拈撝祵Φ玫降奶荻葓D二值化并進行比較。認為含有較多邊界信息的圖指示的方向為條碼的走向。如果兩圖邊界的差值在一定范圍內,則用同樣的方法檢測45°和135°兩個方向。
膨脹算法將條碼連成一個緊密的連通區(qū)域,之后要進行連通域的標記以定位條碼區(qū)域。算法包含3個步驟:
(1)如果當前點A是前景點并且其前一點未被標記,則認為A是一個連通域的外輪廓點;跟蹤這個外輪廓,并將所有外輪廓點都標記為與A屬于相同的連通域。
(2)如果當前點A下方的點是背景點且A的前一點已被標記,則認為A是連通域內輪廓點;跟蹤這個內輪廓,并將所有內輪廓點都標記為與A屬于相同的連通域。
(3)如果前景點A的前一點已被標記且不屬于情況1和2,則將A標記為與其前一點屬于相同的連通域。
邊界的跟蹤是通過搜索像素點8臨域實現(xiàn)的,用順時針排布的1~7分別代表8臨域點,搜索方向更新公式為:
系統(tǒng)采用的連通域標記法舍棄了傳統(tǒng)的二次標記方式,而采用跟蹤連通域外輪廓的方法,只需要對圖像進行一次掃描,因此具有更快的速度。
3.3 條碼的精確定位
本文提出時間復雜度較低的邊緣跟蹤算法,精確定位了條碼的4個頂點,為條碼傾斜和幾何形變的校正提供條件。圖5給出了精確定位算法流程圖。
以搜索左上角頂點為例。系統(tǒng)用參考點數(shù)組記錄搜索到的條碼起始符或結束符的邊緣走向,步進點數(shù)組沿起始結束符黑色邊界方向逐點步進。若步進過程中某一時刻,步進點數(shù)組與參考點數(shù)組夾角超過45°,說明步進點數(shù)組已步進到條碼邊緣,則將步進點數(shù)組中心點位置確定為條碼的左上頂點。用類似的方法搜索,可得到條碼的其他3個頂點。
條碼的4個頂點確定以后,再經(jīng)過旋轉變換、錯切變換和透視變換,將幾何形變的不規(guī)則四邊形條碼校正為矩形條碼。條碼的旋轉使終端的解碼不再局限于水平和垂直的條碼,實現(xiàn)了PDF417的全方位解碼。
3.4 條碼分層及碼字讀取
PDF417是堆疊式條形碼,需要確定條碼的層次以進行逐行碼字的讀取。確定條碼層次的步驟如下:
(1)用Sobel邊緣檢測算子作用于圖像,提取圖像邊界。
(2)將得到的分層界限進行水平投影,記錄投影點數(shù)目p(i)。
(3)隔行差分。按照dif(i)=p(i)-p(i-2)計算第i行的投影差分值。若當前行投影差分值大于零,而其下一行差分值小于零,則認為該行為分層界限。
(4)偽邊界去除。將投影高度小于投影峰值1/4的邊界去除,以消除由噪聲產(chǎn)生的偽邊界。
得到條碼的層邊界后,系統(tǒng)采用層內投影并判斷投影高度的方法來讀取每層條碼的條空信息。實踐證明該方法具有較高的正確率。
用條空的寬度除以單位模塊的寬度得到條碼的條空寬度序列,如:81111113….31111334….711311121。單位模塊寬度求解方法為:
其中,Wm為單位模塊寬度,Wl為層寬,n為一層條空總數(shù)。
最終譯碼采用查表的方式將條空序列轉換為碼字序列。碼字序列經(jīng)過檢錯與糾錯后,按照3種壓縮模式編碼的反方向進行譯碼,最終得到PDF417條碼的原始數(shù)據(jù)。
4 實驗結果
對采集到的28 000幅、分辨率為320×480的圖像進行測試。測試結果表明,本終端對PDF417條碼的識別率可達99.76%,識別碼解碼正確率為100%,解碼速度達10次/s以上,具有國內領先的技術水平。
評論