攝像頭模塊輸出圖像或屏幕顯示出現(xiàn)1像素等間隔水平或垂直條紋的原因以及解決方法-12-04

姓名:戈浚堯

學號: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;

}

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容