2009年5月12日 星期二

YUY2 and Strange Happenings

上星期的課程中有提到Camera影像格式的問題如RGB,YUV,YUY2,etc..

回家就把YUY2 to RGB24的程式寫了一下

只要找到的YUY2的格式以及轉換公式,要寫出來不是什麼問題

YUY2的編碼上一個pixel分別是由Y U(cb) V(cr) 組成,

而YUY2是以4:2:2的比例儲存在buffer理

-------------------------
byte 1 2 3 4 5 6 7 8
format Y1 U0 Y2 V0 Y3 U1 Y4 V1
-------------------------
第一個pixel的組成是 Y1,U0,V0
第二個pixel的組成是 Y2,U0,V0
第三個pixel的組成是 Y3,U1,V1
第四個pixel的組成是 Y4,U1,V1

以上4個pixel來看我們使用的4份的Y跟2份的U跟V,因此會說YUY2是以4:2:2的比例儲存

因此在程式上要將YUY2重新組合成一個pixel的話勢必要經過一番運算

上面的部分只是敘述如何將YUY2重新組合成一個pixel

要轉換成RGB的話還要在帶入另一套公式

RGB to YUY2
Y = 0.299 R + 0.587 G + 0.114 B
Cb = - 0.1687 R - 0.3313 G + 0.5 B + 128
Cr = 0.5 R - 0.4187 G - 0.0813 B + 128

YUY2 to RGB
R = Y + 1.402 (Cr-128)
G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)
B = Y + 1.772 (Cb-128)


上圖是Camera 抓進來的YUY2格式影像
下圖是轉換成RGB後的影像

因為算式有牽涉到floating point的部份,轉換後會有失真的情形出現

而在程式的執行速度上也會比較慢

因此網路上有一些最佳化的演算法可供參考

-------------------------------------
除此之外我還遇到一個問題

我想要把我塞好的一個bitmap物件給assign 到Image2中

結果卻造成以下的情形




這個問題其實我搞了很久

後來看到別人的程式中有一行

Form1->Image2->Picture->Bitmap->PixelFormat=pf24bit;

我就想說放上去看看好了

結果竟然就是這個問題= =

BCB中Image這個物件的『預設』影像格式似乎是32bit(高彩)

但是我們抓取下來的影像卻是24bit(全彩)

因此產生像縮圖一樣的結果出現

其實這行程式在老師的電子書上面有寫出來

但因為我一直主觀認為預設是24bit...所以一直無視他= =

有遇到類似問題的同學可以參考參考

1 則留言: