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