上星期的課程中有提到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 則留言:
小黃好厲害QQ!
張貼留言