姓名:戈浚堯
學號:20021211070
【嵌牛導讀】
本文介紹了自己在做攝像頭驅動時發(fā)現(xiàn)的一個bug,介紹了bug的原理與解決方法
【嵌牛鼻子】
嵌入式、OV2640
【嵌牛正文】
本文所述的所謂條紋,并不是指雜色的條紋,而是觀感上把圖像割裂,讓圖像變模糊的條紋。這種模糊的條紋有可能在驅動類似ov2640這樣的攝像頭,或是MCU 8080接口的屏幕時出現(xiàn)。
?我保存了一幀有這個現(xiàn)象的攝像頭采集回來的圖片,如下圖??梢钥吹剑瑘D片中豎向的內容像是被切開了,變得異常模糊。實際上在這個距離上320*240的分辨率還是可以看清楚字的。

這種現(xiàn)象實際上是由于像素錯位產生的。假設一共有8個像素,顯示正常內容時,像素的排布方式應該如下所示

而產生這樣現(xiàn)象的時候你看到的像素排列實際上是這樣的:

即左右兩個像素點的位置反了,所以看到的圖像在觀感上產生了豎直方向的條紋。有種被撕裂的感覺。那們這樣的現(xiàn)象是如何產生的呢?
有些器件在對其通信方式進行配置的時候,可能選擇了“字傳送”的模式。即攝像頭一次性發(fā)送32位數(shù)據或者MCU發(fā)送32位的數(shù)據至屏幕上。對于RGB565格式的數(shù)據幀來說,半字的數(shù)據剛好是一個像素。如果用一個字母代表一個半字的話,在內存中,他們可能乖巧地按照ABCD的順序排列。可是當如果用一個字長度的指針訪問它的起始地址的話,讀出來一個字的內容就變成了BA,即原來第二個像素的數(shù)據變成了這個字的高16位。當發(fā)送方將這個字以MSB的形式發(fā)送的話。接收方按順序收到的第一個數(shù)據實際上就是第二個像素的內容而不是第一個像素了。這樣循環(huán)發(fā)送,整個畫面上前后兩個像素的內容就都發(fā)生了反轉。
出現(xiàn)了這種問題應該怎么修復呢?
有兩種方法可以參考,一種是用軟件將相鄰兩個像素的數(shù)據進行調換,還有一種是更改數(shù)據發(fā)送方式的配置,讓發(fā)送方半字半字地按順序發(fā)送就可以了。
用軟件地方式可能更簡單一些,不需要深入研究數(shù)據傳送的配置。這邊附上一個將相鄰半字數(shù)據調換的代碼片段,方便大家快速驗證自己碰到的是不是這樣的問題。
//addr為圖像數(shù)據的起始地址 resolution為圖片像素
intexchang_pixel(uint16_t* addr,uint32_tresoltion)
{
if(NULL== addr)
return-1;
uint16_tdata =0;
for(inti =0; i < resoltion ;i = i +2)
? {
? ? data = addr[i];
addr[i] = addr[i +1];
addr[i +1] = data;
? }
return0;
}