CCD映像檢測<二>
作者:一點一滴的Beer 指導教師:Chen Zheng 單位:WHU
二、黑白映像檢測的硬體設計
2.1 電源提供。
圖6: CC的D12V電源電壓源
因為小車的電池電壓為7.2V,而CCD網路攝影機的工作電壓為12V,故需要利用晶片搭建升壓電路,6所示。
2.2 視頻訊號行場同步分離信號。
圖7:視頻訊號行場同步分離信號電路
視頻訊號每場是是不同的行組成,5所示,場與場之間,行與行之間都存在同步訊號,單片機通過對這些同步訊號的捕捉,來控製圖像採集的時序,保證映像採集的正確性。視頻分離信號晶片LM1881能將視頻訊號中的行同步脈衝、消隱脈衝和場同步脈衝提取出來,並將它們轉換成數字訊號交給單片機的I/O 口。視頻分離信號電路7所示。
2.3 行視頻訊號數字化。
由於類比網路攝影機採集的映像訊號為類比訊號,而電腦系統為離散的數字系統,故需要轉換為數字訊號才能交付MCU處理。大賽組委會所推薦的晶片XS系列片內整合了8路AD口,同時還具有豐富的IO介面資源,而且大賽中小車賽道色彩構成的簡單性,使得視頻訊號數字化方案變得多樣化。小車以類比CCD網路攝影機為感應器,類比式的採集先將一路視頻訊號引用圖2電路,通過其可以將網路攝影機輸出的複合視頻訊號進行分離,得到獨立的同步訊號和視頻類比量訊號,然後通過逐行採樣來完成整幅映像的採集。下面主要介紹三種對行訊號的數字化的方法。
2.3.1片內AD模組。
由於XS128本身就含有8路AD,故只需引入一路視頻訊號至任意一個AD口,然後軟體上,先對AD口進行相應的初始化,再在行同步中斷函數中執行以下代碼即可完成數字化:
for(i=0;i<column;i++)
{
while(ATD0STAT0_SCF!=1);//AD轉換等待
*g_video--=ATD0DR0L;//寄存器讀取
}
此方法的優點在於,不需要進行額外的外圍電路設計,直接引入視頻訊號,利用XS128的片內資源進行AD轉換即可得到圖片灰階資料。XS128在超頻到64M的情況下,能每行採集96個點,如果對圖片橫向精度要求不高,選擇此方法最為簡單。但如果CCD看得比較遠,由於映像的幾何畸變,會造成遠方的黑線最後AD結果只有一個黑點,這樣在黑線提取時造成了較高的誤判率,此時此方法就不再適用。
2.3.2基於TLC5510的8位並行AD。
為了每行訊號得到更高的採樣精度,在XS128還有多餘的IO口前提下,我們可以考慮用片外A/D法。TCL5510為一款8位並行高速AD轉換晶片,如果採用獨立時鐘其AD速度能達到20MSPS,然後將數字訊號通過8位元據匯流排並行輸出,直接引入到XS128的一組IO口上,在軟體設計上只需對此IO口進行讀取即可獲得數字訊號。相應AD轉換電路8。
圖8:片外AD轉換電路
晶片對連接埠進行讀取時,為了防止讀取到AD轉換的跳變沿,故需要進行時鐘同步,XS128含有8路PWM輸出,通過對一路PWM進行翻轉輸出一定頻率的脈衝,即可類比一個同步時鐘訊號至片外AD模組,較方便地解決了時鐘同步問題。在實際情況下,XS128超頻到80M時每行能採集240個點,從而遠方黑線消失的現象能得到很好的解決。
除了採樣精度高,更重要的是此方法儲存的是灰階資訊,能極大程度上防止了映像資訊丟失,但是外圍電路比較複雜,而且佔用了較多的IO口資源(需要XS128額外提供一組8位的IO口進行數字訊號讀取)。
如果採集的點比較多,對RAM資源不豐富的XS128來說是個災難。
2.3.3基於電壓比較子的硬體二值。
以上兩種方法最後得到的都是映像的灰階資料,能夠比較逼真地反應CCD所見情景。但是由於大賽中,賽道僅由黑白兩色組成(9),所以即使是灰階資料,我們最後處理時也一般要在軟體上進行二值化將映像分割成黑白二色圖片。所以,我們可以考慮直接用硬體進行映像二值化,將視頻訊號轉換為一組方波訊號,然後直接輸入到一位I/O口中,對這一位的連接埠進行讀取,高電平表示1,低電平表示0。
2.3.3.1硬體二值電路
在軟體上對灰階圖片進行黑白分割時,有兩種方法:
固定閾值法,即高於此閾值電壓,即認為是1,否則是0,然後再通過軟體進行黑線邊緣檢測。
直接通過邊沿跳變法來檢測黑線邊緣,即兩個相鄰點之間灰階值相差一定時,表示到了黑線邊緣。
以上兩種方法都能通過電壓比較子電路實現。分別10和圖11。
圖9:智能車賽道色彩構成
圖10:固定參考電壓二值電路
圖11:邊沿檢測的二值電路
採用固定參考電壓的二值電路設計起來比較簡單,對參考閾值電壓調結也比較方便-只需調結一個電位器阻值即可(為系統增加一個LCD,可直接在調結電位器後採集到的映像),故具有一定的場地適應性。但在實際使用過程中,我們發現採用固定參考電壓的二值電路在CCD視野比較遠時,仍然會出現映像無法分割的現象,此時該方法不再適用,故可以考慮採用邊沿檢測的二值電路。邊沿檢測二值電路中,將原始視頻訊號和滯後處理的視頻訊號輸入到電壓比較子兩端,在視頻訊號跳變邊沿會在兩路輸入產生幅度差(12),然後當幅度相差到一定程度(由滯回電路控制)時,電壓比較子輸出端便發生電平翻轉,最後以方波形式輸出視頻訊號(13,註:第一個低電平區為行同步區,第二個為黑線區)。
圖12.原始視頻訊號(綠色) 和滯後處理的視頻訊號(黃色) |
圖13.原始視頻訊號(綠色) 和輸出方波訊號(黃色) |
2.3.3.2電路中元件參數的整定。
首先我們對一般的RC電路的時間常數進行瞭解,如下面所陳述:
圖14:普通的RC電路
電容兩端的輸出電壓和電源電壓的關係如下:
電壓上升幅度和上升時間(延隔時間)對應關係如下:
T(/RC) |
1 |
2 |
3 |
4 |
5 |
UC/US |
0.632 |
0.865 |
0.95 |
0.98 |
0.993 |
表一:延隔時間表
黑線的視頻訊號時間為3~4µs(R2=1.3K)
圖15:賽道中央黑線產生的視頻訊號
一般為了獲得兩組視頻訊號在同樣的時間軸點時獲得最大的電壓差,就要求,滯後訊號盡量滯後。 但也不能太滯後。比如以下情況:(R2=6.4k)
圖16:當R2比較大時的滯後輸出訊號
下面是幾張不同滯後電阻時的視頻訊號輸出圖:
1.3K的滯後電阻 |
3K滯後電阻 |
6.4的滯後電阻 |
圖17:電路在不同滯後電阻下的輸出波形
那麼我們計算出一個大致R2 的參考值。
我們要求在黑線區,滯後訊號時間剛好為一個黑線視頻訊號的時間,也就是大概3~4µs,在保證在下一次上升沿到來前已經達低穀,以保證上升沿的電壓差。
如表一,大概 t=3~5倍RC,我們就可以認為電壓已經到了最值。那麼,要求滯後視頻訊號能在T0 = 3~5個RC內能夠達到最值,而T0<3~4µs.大致算一下:
3*10-6 = 4*R2*510*10-12
得到R2=1.47K 能在3µs時間後,電壓達到 原始跳變點的0.98
得到R2=1.96K 能在4µs(剛好是一個近處的黑線視頻訊號的寬度)時間後,電壓達到原始跳變點的0.98
所以,一般 R2就取其中的某個值。在實際中,配合LCD,調節R2電位器,結果發現R2=1.85K時有比較好的效果,符合理論計算結果。
關於R4參數的確定方法。參考:http://www.elecfans.com/article/90/150/2009/2009050756701.html
圖18:滯回電壓比較子I/O電壓圖
滯回電壓Vh = R4/ (R4+R5) * (Vo_max - Vo_min)
因為黑線邊緣產生約400mV跳變(由示波器上很容易看出),
所以,滯回電壓選擇為100-400mV
實驗中,將R4設定為4.5K,產生215mV的滯回電壓,一方面能比較好的搞幹擾,一方面,使黑線不至於過細
2.3.3.3硬體二值的特點。
採用邊沿檢測電路,通過對兩個電位器大小的調整,便能適應不同比賽場地光線,而且能適應CCD的不同視野,具有較強的圖片分割能力,具有更強的場地適應性。而對比片外AD,此方案具有以下優點:
1.電路設計更簡單。
2.佔用晶片IO口只有一位,為片外AD的1/8。
3.不用考慮時鐘同步的問題。
4.橫向精度可以視為無限(因為直接以類比電平訊號輸入,由MCU的一位連接埠對電平讀取),在滿足要求的情況下,MCU不用超頻甚至還需要分頻,8M頻率讀連接埠便能每行採集120多個點,所以不會存在當視野比較遠時出現黑線斷開的現象。
5.採用硬體二值,直接對圖片進行了正確有效分割,減少了CPU的運算量,增加了分割的可靠性。
顯然,因為以上優點使得硬體二值的檢測方案對於色彩簡單的賽道環境擁有極大的優勢。但是此方案的檢測方式也存在局限性,對縱向的黑線檢測具有比較高的準確性,但是在小車運動時對於橫向黑線檢測會出現不穩定現象(即有檢測方式問題,也有CCD本身問題,也和採樣行的選擇有關係),最明顯的是對十字交叉線和起跑線的區分,在檢測十字交叉線時,因為CCD網路攝影機安裝方式和球面鏡頭本身原故就會存在一定的失真,使十字線橫向線呈弓形(遠處為外弓箭形,近處為內弓箭形)
圖19:用AD模組採集到的正常的十字線和起跑線
圖20:十字交叉線的檢測問題
圖21:起跑線的檢測問題
如果出現以上狀況,那麼起跑線的檢測就變得相當困難(基本沒法正常檢測):一方面有來自十字交叉線的幹擾,另外一方面也因為起跑線本身檢測的不穩定。於是我們為瞭解決起跑線問題,額外用AD採集了近處的10行(因為是近處,所以對行的精度要求不高,可以佔用較少的記憶體),單獨作為起跑線判斷依據。
2.3.3.4硬體二值的應用展望。
硬體二值最大的特點是:輸出的是類比TTL電平訊號,而這種訊號是MCU所能處理和識別的電平訊號,這就給硬體處理映像提供了很大的發展空間。映像採集的主要問題就是精度和逼真度。逼真度和採集方法有關,而精度的提高則很大程度上受到晶片RAM資源的限制。在採用硬體二值進行採集時,圖片會無法避免的造成一定失真,但是卻基本能滿足使用者需求,故展望之處可以從提高採集精度上著手。當網路攝影機視野比較廣時,如果採樣行比較稀疏,那麼,會造成資料的大量丟失,嚴重時甚至會出現同一圖片中黑色引導線不連續的情況,這對黑線提取是極其不利的。下面介紹兩種方法來提高精度,分別是硬體層面和軟體層面,供大家參考。
硬體層面:
(1)將硬體二值後的視頻訊號直接進入單片機的輸入捕捉模組,用硬體來提取我們關心的一些資訊,然後再對這些資料分析計算出對自己有用的資訊,這樣一方面硬體為我們承擔了一部分的資料處理,另外一方面,使記錄一行視頻訊號所用的資料變得很少,這對高主頻但是卻低RAM的XS128晶片來說是個很好的訊息,這樣我們可以在RAM一定時可以極大提高採集的映像的縱向精度。
用HCS12單片機輸入捕捉來對 微分電路視頻輸出進行捕捉, 檢測到跳變時,就計錄當前的TCNT,然後儲存在一個數組中,顯然,這樣一行在理想智能汽車賽道中,最多10個, 就如以下情況(而且發生的可能極小----三條賽道並行,而且不還有一條起跑線,而且CCD的視角把它們全部拍攝進去了)。
圖22:理想賽道環境時的極限情況
圖23:實際賽道環境
在實際的賽道中,一方面有來自交叉賽道的黑線正常幹擾,另外一方面有來自光線的幹擾,特別是賽道邊緣地帶,會有些雜亂的幹擾訊號,這個對硬體邊緣檢測計數是極其不利的。在用軟體處理時也同樣有這樣的問題,這個問題是用部分搜尋來解決的。因為在近處,CCD因為視野原因,正常情意下基本上不太可能看到賽道外部,於是這樣就能確定起始搜尋列的位置,然後逐步遞推上去在一個小範圍內搜尋,當然還有些其它容錯的思想在此不再贅述。在硬體層面上,同樣也能實現逐步搜尋:在第一行訊號進入時,根據上一行的中心,來對視頻訊號檢測時機進行適當延時,跳過幹擾地帶後,再對跳變點進行檢測。當本行訊號檢測完畢後,或者,檢測的跳變點超過一定數目後,就停止本行檢測,再對下一行檢測。
一行只而要以一個大小為10左右的數組就能儲存到此極限情況下的有用(邊緣跳變)的資訊,對於一般存在邊緣幹擾的情況,通過局部搜尋的做法,用10個資料也能儲存本行的有用資訊。這樣,受儲存空間限制而無法提高映像精度的矛盾就解決了,以前4K只能儲存橫向96列的點列40行,現在可以儲存新的點列的行數 甚至可以達到320行以上,而CCD的行視頻訊號只有320行,所以採集多少行已經沒有多少意義了。更重要的是,它能把中心用硬體提取出來,我們要做的只是在軟體上進行容錯和判斷即可。而且,這樣做,橫向的解析度也沒有了意義了,因為16位的TCNT計數,遠方的黑線不論有多細,只要CCD能在CRT顯示器上看到,用TCNT也一定能記錄下來,所以,基本上不存在遠方黑線的寬度過小甚至消失的現象.
軟體層面:
(2)利用新的資料結構,用時間換空間,這樣在不採用計數器也能利用有限的空間儲存更多的資料,這樣就自然提高了映像採集的精度。
將開關量儲存在一個位結構數組中,每8個開關量可以儲存在一個位中,於是橫向儲存空間節省了7/8,這樣,可以提高縱身精度和橫向精度,但這是以犧牲MCU的計算量為代價的,因為XS128不支援位定址,所以對圖片bit的存取效率會變為原來直接對byte存取的1/3,就是不知道這個犧牲能不能忍受。如果能忍受,圖片在4K的空間下,可以儲存 160 橫向解析度的圖片200多行。
這個是以時間換取空間,以前片內AD也試過,當時受限於XS128內部的AD頻率,而導致 圖片bit的儲存大大影響了AD轉換,所以一行還是採集不到96個點。但是用硬體二值,就不存在AD等待時間,目前8M的頻率讀取,可以每行採集120個點,如果將頻率提高一些,就能夠彌補位結構儲存時所佔用的時間了。所以採集上理論上不會存在問題。
位結構資料類型如下:
代碼
typedef unsigned char byte;
//二值圖片 位結構----節省MCU的記憶體開銷(8位的像素值)
typedef union {
byte Byte;
struct {
byte B0 :1; /* Bit 0 */
byte B1 :1; /* Bit 1 */
byte B2 :1; /* Bit 2 */
byte B3 :1; /* Bit 3 */
byte B4 :1; /* Bit 4 */
byte B5 :1; /* Bit 5 */
byte B6 :1; /* Bit 6 */
byte B7 :1; /* Bit 7 */
} Bits;
} BYTE;
像操作結構體一樣去操作位,然後逐位儲存開關量。此方法有一個缺點:運算效率低。因為HCS12系列晶片都不支援位定址,所以,在對位進行存取時,實際操作還是先讀一位元組8位,然後再和相應的資料進行位元運算提取某一位的資料,這樣,資料讀取的效率就變得很低了。所以這是一個以時間換取空間的方法,具體在實際中能否應用,就要看它實際應用時的優和劣的對比了。
2.3.4
幾種方案比較。
採集方法 |
優點 |
缺點 |
片內AD |
電路設計簡單,直接利用晶片內部整合模組,採集到的映像失真度小。 |
映像橫向精度難以提高,在處理時會有映像閾值分割的困難。 |
片外並行AD |
採集映像失真度小,而且精度可以滿足使用者需求。 |
佔用I/O資源過多,電路設計比較繁瑣,而且最終也會有映像分割的問題。 |
硬體二值 |
採用硬體將圖片分割,輸出為TTL電平,精度可認為是無限的。 |
將外界資訊直接二值化後交付晶片處理,意味著圖片的很多資訊的丟失。同時,在小車運動狀態下,採集橫向黑線會出現不穩定的現象。 |