如何處理視頻訊號?視頻訊號種類很多,RGB,YUV,CVBS,S-VIDEO等等,學電子的,搞視頻影像處理的,可能最終會用到上位機處理。我就是這樣,呵呵,前段時間做了YUV資料的影像處理,用68013從CMOS sensor採集而來,上位機用GDI做的,費了不少勁,要瞭解YUV,就要瞭解RGB,要瞭解RGB,就要瞭解bmp圖片,記憶體存放順序,等等。
bmp圖片可以說是最簡單的格式了,尾碼一般是.bmp或.DIB,關於DIB格式,隨便百度下,或找本VC介紹GDI的書看看就明白了,下面以一個例子來說明,估計這樣好理解點,印象也深刻。
1 .首先,用Windows內建的畫圖程式建立一個紅綠兩色的圖片,尺寸大小640×480像素,如:
OK,現在我們用UltraEdit開啟這幅bmp圖片,看到的是這樣的16進位數:
2 .我們觀察:從地址36H開始到最後有多少個位元組,最後是E1035H,E1035-36+1(別說為什麼要+1),
結果是E1000,十進位就是921600;
好,然後我們看以下,640×480×3等於多少呢?bingo!640×480×3=921600;
為什麼呢?呵呵,下面解釋(有人問為什麼從36H開始的話,等等下面再說!!):
首先我們用畫圖程式建立的bmp檔案是RGB24格式的,我們建立的640×480的圖片,意思是這個圖片含有640×480個像素(別說不知道什麼是像素--!)RGB24格式(也就是RGB888)是指一個像素用RGB表示,有3個位元組,R,G,B各佔8位共24位,這就為什麼叫RGB24或RGB888的原因了;
那麼,現在清楚了吧,640×480個像素,一個像素(R/G/B三個分量)佔3個位元組,那剛好就是921600個位元組;所以我們就知道了,從36H開始,一直到最後,就是這幅圖的映像資料資訊
3.然後我們看上面的紅綠圖片,按照上面說的,第一個像素應該是紅色,RGB值應該是(255,0,0)。
好,那麼我們來看下面的16進位圖,從36H開始,36H,37H,38H這3個連續的位元組表示第一個像素,依次是:00 00 FF,也就是RGB(0,0,255)-這是藍色的RGB值!!為什麼會這樣呢?
這是因為一個像素的RGB值在記憶體中的排列不是RGB,而是BGR這樣排列的,所有像素排列是BGRBGRBGRBGR.....,所以00 00 FF表示的RGB值應該是B-00,G-00,R-255,就是(255,0,0)紅色的RGB值了,呵呵~
4. 下面說為什麼從36H開始:
首先,我們知道,圖片有很多種,bmp啊,jpg啊,gif啊等等,那麼36H以後是映像資訊,那麼映像的格式在哪裡儲存呢?嘿嘿,就在前面的54個位元組中(0-35H,10進位就是54),當然,這54個位元組還有其他資訊。
對照上面第二個16進位數的圖:
0000H-0001H(2位元組):42 4D——表示該檔案是bmp檔案
0002H-0005H(4位元組):36 10 0E 00——整個bmp檔案的大小(單位位元組)。按照記憶體中資料存放地位在
前,高位在後的原則,這個數是 實際是000E1036,10進位是 921654=640×480
×3+54(位元組)。
0006H-0009H(4位元組):00 00 00 00——系統保留,必須設定為0
000AH-000DH(4位元組):36 00 00 00——從bmp檔案開始到位元影像資料開始之間的位移量(位元組)。也就是
映像資料前的54個位元組,00000036,10進位是54.
000EH-0011H(4位元組):28 00 00 00——位元影像資訊頭的的長度
0012H-0015H(4位元組):80 02 00 00——位元影像寬度,單位像素。00000280,10進位是640.
0016H-0020H(4位元組):E0 01 00 00——位元影像高度,單位像素。000001E0,10進位是480.
001CH-001DH(2位元組):18 00——每個像素的位元。RGB24當然每個像素24位了,16進位的18.
001EH-0021H(4位元組):00 00 00 00——0,表示不壓縮(BI_RGB)。
0022H-0025H(4位元組):00 10 0E 00——用位元組數表示的位元影像資料大小。000E1000就是640×480
0026H-0029H(4位元組):00 00 00 00——用像素/米表示的水平解析度。
002AH-002DH(4位元組):00 00 00 00——用像素/米表示的垂直解析度。
002EH-0031H(4位元組):00 00 00 00——位元影像使用的顏色數
0032H-0035H(4位元組):00 00 00 00——指定重要的顏色數,為0表示所有顏色都重要。
以上的54位元組意義可以很容易和VC中位元影像資訊頭結構體聯絡起來:
在VC中定義的位元影像資訊頭為:
typedef struct tagBITMAPINFOHEADER{ // bmih
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
可以和上面的一一對應,具體每個參數的意義,自行可查閱MSDN。
好了,寫到這裡,下次寫下各種視頻資料格式吧,也就從網上東抄西摘了。