當前位置:首頁 » 安卓系統 » androidrgbtoyuv

androidrgbtoyuv

發布時間: 2023-04-10 19:39:38

『壹』 如何RGB幀轉換為YUV在Android中使用GPU

幀數與CPU&GPU有關,就和電腦者叢孫一樣,CPU主頻越高幀數越高,且不會遞減,GPU越高幀鄭賣數也越高,但是有閥值 所以,在GPU和CPU相同的起始情況下,CPU的提升比GPU的提升效果更明顯 RAM的話主要是保持幀數,與幀數高低無關。也就是RAM不夠可能會在運行的時候大卡一下,RAM足夠支持的時候,就算提升了也沒什麼首鏈變化

『貳』 求助:怎麼直接顯示YUV格式圖像

其實android裡面定義的有overlay的介面,如果你的硬體支持的話,應該可以直接調用顯示。但是好像沒有開放overlay的借口給java層,所以你應該只能在framework層調用overlay來顯示你的解碼後的圖像。具體的例子,你可以參考一下camera 的實現,做pre-view的時候就是調用的overlay直接顯示的。

『叄』 RGB與YUV

每個像素用1個bit表示,可表示的顏色范圍為雙色,即最傳統的黑和白。1個bit只能表示0,1兩種值。需要調色板,不過調色板只包含兩種顏色。

每個像素用4個bit表示,4個bit所能夠表示的索引范圍是0-15,共16個。也就是可以表示16種顏色。即調色板中包含16中顏色。

每個像素用8個bit表示。8個bit所能夠表示的索引范圍是0-255,共256個。也就是可以表示256中顏色。即調色板中包含256中顏色。

RGB像素格式中的bit存儲的是每一個像素點的R,G,B值

一個像素用16個bit = 2個byte表示 ,R=5 G=6 B=5

為什麼綠色為6位?

一個像素用16個bit = 2個byte,但是最高位不用,R=5 G=5 B=5

RGB24圖像每個像素用8個bit,共24個位表示,共3個位元組,注意:在內存中RGB各分量的排列順序為:BGR

RGB32圖像每個像素用32個bit表示,佔4個byte,R,G,B分量分別用8個bit表示,存儲順序為B,G,R,最後8個位元組保留。注意:在內存中RGB各分量的排列順序為:BGR

RGB32圖像每個像素用32個bit表示,佔4個位元組,R,G,B分量分別用8個bit表示,存儲順序為B,G,R,最後8個為透明像素。注意:在內存中RGB各分量的排列順序為:BGRA

注意:java默認使用大端位元組序,c/c++默認使用小端位元組序,android平台下Bitmap.config.ARGB_8888的Bitmap默認是大端位元組序,當需要把這個圖片內存數據給小端語言使用的時候,就需要把大端位元組序轉換為小端位元組序。例如:java層的ARGB_565傳遞給jni層使用時,需要把java層的ARGB_565的內存數據轉換為BGRA565。
詳細驗證請看: Android Bitmap像素排列與JNI操作

YUV有很多變種,我們常說的YUV指的是YCbCr,YUV三個字母中,其中」Y」表示明亮度(Lumina nce或Luma),也就是灰階值;而」U」和」V」表示的則是色度(Chrominance或Chroma)作用是描述影像色彩及飽和度,用於指定像素的顏色。Cb指藍色色度分量,而Cr指紅色色度分量,是標准 YUV 的一個翻版(還有YPbPr等),此文中,我們就用 YUV 指代 YCbCr 了。

首先,YUV按照數據大小分為三個格式,YUV420,YUV422,YUV444。由於人眼對Y的敏感度遠超於對U和V的敏感,所以可以多個Y分量共用一組UV,這樣既可以極大的節省空間,又可以不太損失質量。

按照多個 Y 分量共用一個 UV 的方式,我們可以把 YUV 分為 420,422,444 三種類型,而在這三種類型之下,我們又可以按照 YUV 的排列儲存順序,將其細分為好多種格式,這些格式數量繁多,又不好記憶,這為我們學習過程中造成了不少困難。下面我就為大家一一介紹。

首先,我們將可以按照 YUV 的排列方式,再次將 YUV 分成三個大類,Planar,Semi-Planar 和 Packed。

Planar YUV 三個分量分開存放
Semi-Planar Y 分量單獨存放,UV 分量交錯存放
Packed YUV 三個分量全部交錯存放
按照這三種方式,我們就可以將 YUV 格式進行比較細致的分類了。
YUV的所有格式列表

一張從上到下分別為原圖、Y、U 和 V:

YUV 4:4:4 采樣,意味著 Y、U、V 三個分量的采樣比例相同,因此在生成的圖像里,每個像素的三個分量信息完整,都是 8 bit,也就是一個位元組。

如下圖所示:

其中,Y 分量用叉表示,UV 分量用圓圈表示。

舉個例子 :
假如圖像像素為:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
那麼采樣的碼流為:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
最後映射出的像素點依舊為 [Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]

假如圖像像素為:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
那麼采樣的碼流為:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
最後映射出的像素點依舊為 [Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]

可以看到這種采樣方式的圖像和 RGB 顏色模型的圖像大小是一樣,並沒有達到節省帶寬的目的,當將 RGB 圖像轉換為 YUV 圖像時,也是先轉換為 YUV 4:4:4 采樣的圖像。

YUV 4:2:2 采樣,意味著 UV 分量是 Y 分量采樣的一半,Y 分量和 UV 分量按照 2 : 1 的比例采樣。如果水平方向有 10 個像素點,那麼采樣了 10 個 Y 分量,而只採樣了 5 個 UV 分量。

如下圖所示:

舉個例子 :
假如圖像像素為:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3] 那麼采樣的碼流為:Y0 U0 Y1 V1 Y2 U2 Y3 V3
其中,每采樣過一個像素點,都會采樣其 Y 分量,而 U、V 分量就會間隔一個採集一個。
最後映射出的像素點為 [Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]

假如圖像像素為:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
那麼采樣的碼流為:Y0 U0 Y1 V1 Y2 U2 Y3 V3 其中,每采樣過一個像素點,都會采樣其 Y 分量,而 U、V 分量就會間隔一個採集一個。
最後映射出的像素點為 [Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]

采樣的碼流映射為像素點,還是要滿足每個像素點有 Y、U、V 三個分量。但是可以看到,第一和第二像素點公用了 U0、V1 分量,第三和第四個像素點公用了 U2、V3 分量,這樣就節省了圖像空間。

一張 1280 * 720 大小的圖片,在 YUV 4:2:2 采樣時的大小為:

可以看到 YUV 4:2:2 采樣的圖像比 RGB 模型圖像節省了三分之一的存儲空間,在傳輸時佔用的帶寬也會隨之減少。

YUV 4:2:0 采樣,並不是指只採樣 U 分量而不採樣 V 分量。而是指,在每一行掃描時,只掃描一種色度分量(U 或者 V),和 Y 分量按照 2 : 1 的方式采樣。比如,第一行掃描時,YU 按照 2 : 1 的方式采樣,那麼第二行掃描時,YV 分量按照 2:1 的方式采樣。對於每個色度分量來說,它的水平方向和豎直方向的采樣和 Y 分量相比都是 2:1 。

如下圖所示:

假設第一行掃描了 U 分量,第二行掃描了 V 分量,那麼需要掃描兩行才能夠組成完整的 UV 分量。

舉個例子 :
假設圖像像素為:[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3][Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7] 、[Y8 U8 V8]
那麼采樣的碼流為:Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8其中,每采樣過一個像素點,都會采樣其 Y 分量,而 U、V 分量就會間隔一行按照 2 : 1 進行采樣。
最後映射出的像素點為:[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7][Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]

假設圖像像素為:[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3][Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7] 、[Y8 U8 V8]
那麼采樣的碼流為:Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8其中,每采樣過一個像素點,都會采樣其 Y 分量,而 U、V 分量就會間隔一行按照 2 : 1 進行采樣。
最後映射出的像素點為:[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7][Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]

從映射出的像素點中可以看到,四個 Y 分量是共用了一套 UV 分量,而且是按照 2*2 的小方格的形式分布的,相比 YUV 4:2:2 采樣中兩個 Y 分量共用一套 UV 分量,這樣更能夠節省空間。

一張 1280 * 720 大小的圖片,在 YUV 4:2:0 采樣時的大小為:

可以看到 YUV 4:2:0 采樣的圖像比 RGB 模型圖像節省了一半的存儲空間,因此它也是比較主流的采樣方式。

YUV 的存儲格式,有兩種:

YUYV 格式是採用打包格式進行存儲的,指每個像素點都採用 Y 分量,但是每隔一個像素采樣它的 UV 分量,排列順序如下:

UYVY 格式也是採用打包格式進行存儲,它的順序和 YUYV 相反,先採用 U 分量再采樣 Y 分量,排列順序如下:

YUV 422P 格式,又叫做 I422,採用的是平面格式進行存儲,先存儲所有的 Y 分量,再存儲所有的 U 分量,再存儲所有的 V 分量。

基於 YUV 4:2:0 采樣的格式主要有 YUV 420P 和 YUV 420SP 兩種類型,每個類型又對應其他具體格式。

I420 的單幀結構示意圖如下(Planar 方式)

這幅圖的上面一幅可以看出 Y1、Y2、Y7、Y8 共用 U1 和 V1。後面的線性數組為其存儲順序,可以看出 Y、U 和 V 都是順序存儲的,往外寫的時候,先按順序將 Y 分量寫出,然後再根據 U、V 分別將它們依次寫出即可。

NV12的單幀結構示意圖如下(Planar 方式)

可以看出與 YV12 不同的時,它的 Y 雖然也是順序存儲,但 U、V 卻是交錯存儲的,這種方式存儲在往外寫出時則先直接順序寫出 Y,然後對 UV 分別依次寫出。

PS:Android的Camera Preview默認圖像格式為NV21。

把RGB和YUV的范圍都縮放到[0,255]
YUV轉RGB

RGB轉YUV

參考資料:
圖片RGB數據格式
一文讀懂 YUV 的采樣與格式
視音頻數據處理入門:RGB、YUV像素數據處理
Android Bitmap像素排列與JNI操作
YUV420_SVG

『肆』 android openGL ES能不能支持yuv直接顯示 而不是轉換成RGB再顯示

現在可以是可以的,因為我現在都在做,只不過遇到些些問題,樓主如果還在研究這個的話可以共同探討下

『伍』 如何將rgb 模式轉換成 yuv 模式

YUV格式具有亮度信息和色彩信息分離的特點,但大多數圖像處理操作都是基於RGB格式。
因此當要對圖像進行後期處理顯猛基州示時,需要把YUV格式轉換成RGB格式。
1. 基本實現
按照YUV與RGB的變換公式,逐像素訪問Y、U、V分量的值,並轉換成RGB。
2. 基於查表法的實現
逐一訪問像素,進行浮點運算,比較耗時,因而利用空間換時間思路,以查找表來替代轉換過程中的一些計算。
3. 基於OpenCV的實現
利用OpenCV提供的轉換函數實現YUV到鋒瞎RGB的轉換,實現簡單方便。實現過程,只需枝蔽要合理構造包含YUV數據的Mat。

『陸』 android yuv怎麼轉換成RGB565

參數分別是寬,高,原數據指針,轉化後的目標數據指針。


你找的這個函數是用C寫的,而你的save(byte[]yuv420,Stringpath,intwidth,intheight,intquality)是JAVA,因此你要使用JNI。或者你把cvt_420p_to_rgb565函數轉成JAVA版。

舉個例子使用jni(實際自己測試):

cvt_420p_to_rgb565修改為

#ifdef__cplusplus
extern"C"{
#endif

JNIEXPORTjobjectArrayJNICALL你的包名_類名_cvt420pToRGB565(JNIEnv*env,jobjectobj,jintwidth,jintheight,jcharArraysrcData,jcharArraydstData);
#ifdef__cplusplus
};
#endif

JNIEXPORTjobjectArrayJNICALL你的包名_類名_cvt420pToRGB565(JNIEnv*env,jobjectobj,jintwidth,jintheight,jcharArraysrcData,jcharArraydstData)
{
unsignedchar*src=(unsignedchar*)(env->GetByteArrayElements(srcData,0));
unsignedchar*dst=(unsignedchar*)(env->GetByteArrayElements(dstData,0));

下面照抄!!

『柒』 RGB與YUV相互轉換公式

RGB轉化為YUV

Y = 0.299 R + 0.587 G + 0.114 B

U = - 0.1687 R - 0.3313 G + 0.5 B + 128

V = 0.5 R - 0.4187 G - 0.0813 B + 128

YUV轉化為RGB

R = Y + 1.402 (V-128)

G = Y - 0.34414 (U-128) - 0.71414 (V-128)

B = Y + 1.772 (U-128)

https://blog.csdn.net/leixiaohua1020/article/details/50534150

熱點內容
重慶壓縮機廠 發布:2025-07-05 00:14:53 瀏覽:756
php55兼容 發布:2025-07-05 00:14:52 瀏覽:543
公主出國訪問 發布:2025-07-05 00:13:26 瀏覽:570
伺服器IP作為登錄IP 發布:2025-07-05 00:10:56 瀏覽:979
防雷支架應配置什麼電纜 發布:2025-07-05 00:05:56 瀏覽:220
iosc語言函數 發布:2025-07-05 00:02:40 瀏覽:993
android打飛機 發布:2025-07-04 23:59:34 瀏覽:210
mr底層演算法 發布:2025-07-04 23:14:59 瀏覽:781
怎麼注冊作業盒子密碼 發布:2025-07-04 23:14:51 瀏覽:924
速達伺服器ip 發布:2025-07-04 23:07:38 瀏覽:262