2012-12-05 118 views
0

我正在開發一個Android應用程序,它爲從相機傳遞的每個YUV圖像,它隨機選取10個像素並檢查它們是紅色還是藍色。 我知道如何做到這一點的RGB圖像,但不是爲YUV格式。 由於運行時間限制,我無法將其逐像素轉換爲RGB圖像。YUV圖像處理

+1

你如何定義一個顏色是紅色或藍色,在RGB?您是否已經檢查過YUV的基礎知識,例如http://software.intel.com/sites/products/documentation/hpc/ipp/ippi/ippi_ch6/ch6_color_models.html? – mmgp

回答

7

我假設你正在使用Camera API的預覽回調函數,其中你爲每個幀獲得一個byte []數據數組。

首先,您需要選擇要使用的YUV格式。需要支持NV21,並且自Android 3.0以來需要YV12。沒有其他格式保證可用。所以NV21是最安全的選擇,也是默認選擇。

這兩種格式都是YUV 4:2:0格式;顏色信息在兩個維度上都以2x進行二次採樣,並且圖像數據的佈局與標準交錯RGB格式相當不同。 FourCC.org's NV21 description作爲一個來源,具有您想要的佈局信息 - 首先是Y平面,然後是UV數據交錯。但是由於兩個顏色平面只是Y平面尺寸的四分之一,所以您必須決定如何對它們進行上採樣 - 最簡單的就是最近的鄰居。所以,如果你想像素(X,Y)的大小的圖像(W,H),最近的鄰居的做法是:


Y = image[ y * w + x]; 
U = image[ w * h + floor(y/2) * (w/2) + floor(x/2) + 1] 
V = image[ w * h + floor(y/2) * (w/2) + floor(x/2) + 0] 

更復雜的採樣(雙線性,立方等)的色度通道可以也可以使用,但什麼是合適的取決於應用程序。

一旦你有YUV像素,你需要解釋它。如果您在RGB中操作更加舒適,則可以使用這些JPEG轉換方程Wikipedia來獲取RGB值。

或者,您可以使用較大的V(Cr)正值來表示紅色,特別是如果U(Cb)較小。

+0

非常感謝你的先生 –

-2

YUV只是另一種顏色空間。您可以在YUV空間中定義紅色,就像在RGB空間中一樣。一個簡單的calculator建議在YUV空間中RGB值255.0,0(紅色)應該顯示爲類似於76,84,255的東西,所以只需尋找與之相近的東西即可。

+0

請解釋downvotes。 –

+0

@LonelyCoder - 曾經有一段時間,一個追蹤者對我的所有帖子進行了低估 - 這可能是原因。 – OldCurmudgeon

1

從魯本Scratton的答案 Converting YUV->RGB(Image processing)->YUV during onPreviewFrame in android?

可以使相機預覽使用RGB格式而不是YUV。

試試這個:

Camera.Parameters.setPreviewFormat(ImageFormat.RGB_565);

+2

RGB_565不保證被支持。您需要首先檢查getSupportedPreviewFormats(http://developer.android.com/reference/android/hardware/Camera.Parameters.html#getSupportedPreviewFormats())以查看它是否已列出。 –

+0

我的三星Galaxy S3確實不支持RGB格式 –