yuv格式有兩大類:planar和packed。
對於planar的yuv格式,先連續儲存所有畫素點的y,緊接著儲存所有畫素點的u,隨後是所有畫素點的v。
對於packed的yuv格式,每個畫素點的y,u,v是連續交*儲存的。
yuv,分為三個分量,「y」表示明亮度(luminance或luma),也就是灰度值;而「u」和「v」 表示的則是色度(chrominance或chroma),作用是描述影像色彩及飽和度,用於指定畫素的顏色。
yuv 碼流的儲存格式其實與其取樣的方式密切相關,主流的取樣方式有三種,yuv4:4:4,yuv4:2:2,yuv4:2:0,關於其詳細原理,可以通過網 上其它文章了解,這裡我想強調的是如何根據其取樣格式來從碼流中還原每個畫素點的yuv值,因為只有正確地還原了每個畫素點的yuv值,才能通過yuv與 rgb的轉換公式提取出每個畫素點的rgb值,然後顯示出來。
用三個圖來直觀地表示採集的方式吧,以黑點表示取樣該畫素點的y分量,以空心圓圈表示採用該畫素點的uv分量。
先記住下面這段話,以後提取每個畫素的yuv分量會用到。
yuv 4:4:4取樣,每乙個y對應一組uv分量。
yuv 4:2:2取樣,每兩個y共用一組uv分量。
yuv 4:2:0取樣,每四個y共用一組uv分量。
2. 儲存方式
下面我用圖的形式給出常見的yuv碼流的儲存方式,並在儲存方式後面附有取樣每個畫素點的yuv資料的方法,其中,cb、cr的含義等同於u、v。
(1) yuvy 格式 (屬於yuv422)
yuyv為yuv422取樣的儲存格式中的一種,相鄰的兩個y共用其相鄰的兩個cb、cr,分析,對於畫素點y'00、y'01 而言,其cb、cr的值均為 cb00、cr00,其他的畫素點的yuv取值依次類推。(2) uyvy 格式 (屬於yuv422)
uyvy格式也是yuv422取樣的儲存格式中的一種,只不過與yuyv不同的是uv的排列順序不一樣而已,還原其每個畫素點的yuv值的方法與上面一樣。
(3) yuv422p(屬於yuv422)
(4)yv12,yu12格式(屬於yuv420)
yu12和yv12屬於yuv420格 式,也是一種plane模式,將y、u、v分量分別打包,依次儲存。其每乙個畫素點的yuv資料提取遵循yuv420格式的提取方式,即4個y分量共用一 組uv。注意,上圖中,y'00、y'01、y'10、y'11共用cr00、cb00,其他依次類推。
(5)nv12、nv21(屬於yuv420)
nv12和nv21屬於yuv420格式,是一種two-plane模式,即y和uv分為兩個plane,但是uv(cbcr)為交錯儲存,而不是分為三個plane。其提取方式與上一種類似,即y'00、y'01、y'10、y'11共用cr00、cb00
yuv420 planar資料, 以720×488大小圖象yuv420 planar為例,
其儲存格式是: 共大小為(720×480×3>>1)位元組,
分為三個部分:y,u和v
y分量: (720×480)個位元組
u(cb)分量:(720×480>>2)個位元組
v(cr)分量:(720×480>>2)個位元組
三個部分內部均是行優先儲存,三個部分之間是y,u,v 順序儲存。
即yuv資料的0--720×480位元組是y分量值,
720×480--720×480×5/4位元組是u分量
720×480×5/4 --720×480×3/2位元組是v分量。
4 :2: 2 和4:2:0 轉換:
最簡單的方式:
yuv4:2:2 ---> yuv4:2:0 y不變,將u和v訊號值在行(垂直方向)在進行一次隔行抽樣。 yuv4:2:0 ---> yuv4:2:2 y不變,將u和v訊號值的每一行分別拷貝乙份形成連續兩行資料。
在yuv420中,乙個畫素點對應乙個y,乙個4x4的小方塊對應乙個u和v。對於所有 yuv420影象,它們的y值排列是完全相同的,因為只有y的影象就是灰度影象。yuv420sp與yuv420p的資料格式它們的uv排列在原理上是完 全不同的。420p它是先把u存放完後,再存放v,也就是說uv它們是連續的。而420sp它是uv、uv這樣交替存放的。(見下圖) 有了上面的理論,我就可以準確的計算出乙個yuv420在記憶體中存放的大小。 width * hight =y(總和) u = y / 4 v = y / 4
所以yuv420 資料在記憶體中的長度是 width * hight * 3 / 2,
假設乙個解析度為8x4的yuv影象,它們的格式如下圖:
yuv420sp格式如下圖
yuv420p資料格式如下圖
旋轉90度的演算法:
public static void rotateyuv240sp(byte src,byte des,int width,int height)
{int wh = width * height;
//旋轉y
int k = 0;
for(int i=0;ii420 : 亮度(行×列) + v(行×列/4) + u(行×列/4)
可以看出,yv12和i420基本上是一樣的,就是uv的順序不同。
繼 續我們的話題,經過第一次資料壓縮後rgb24->yuv(i420)。這樣,資料量將減少一半,為什麼呢?呵呵,這個就太基礎了,我就不多寫了。 同樣,如果是rgb24->yuv(yv12),也是減少一半。但是,雖然都是一半,如果是yv12的話效果就有很大損失。然後,經過x264編碼 後,資料量將大大減少。將編碼後的資料打包,通過rtp實時傳送。到達目的地後,將資料取出,進行解碼。完成解碼後,資料仍然是yuv格式的,所以,還需 要一次轉換,這樣windows的驅動才可以處理,就是yuv2rgb24。
yuy2 是 4:2:2 [y0 u0 y1 v0]
yuv420p 和 yuv420的區別 在儲存格式上有區別
yuv420p:yyyyyyyy uuuuuuuu vvvvv yuv420: yuv yuv yuv
yuv420p,y,u,v三個分量都是平面格式,分為i420和yv12。i420格式和yv12格式的不同處在u平面和v平面的位置不同。在i420格式中,u平面緊跟在y平面之後,然後才是v平面(即:yuv);但yv12則是相反(即:yvu)。
yuv420sp, y分量平面格式,uv打包格式, 即nv12。 nv12與nv21類似,u 和 v 交錯排列,不同在於uv順序。
i420: yyyyyyyy uu vv =>yuv420p
yv12: yyyyyyyy vv uu =>yuv420p
nv12: yyyyyyyy uvuv =>yuv420sp
nv21: yyyyyyyy vuvu =>yuv420sp
YUV格式說明
yuv,是一種顏色編碼方法,y表示明亮度 luminance luma u和v則是色度 濃度 chrominance chroma yuv,y uv,ycbcr,ypbpr等都可以稱為yuv,彼此有重疊。yuv和y uv通常用來描述模擬訊號,ycbcr與ypbpr則是用來描述數字的影像訊號。yuv顏...
YUV格式詳解
yuv格式通常有兩大類 打包 packed 格式和平面 planar 格式。前者將yuv分量存放在同乙個陣列中,通常是幾個相鄰的畫素組成乙個巨集畫素 macro pixel 而後者使用三個陣列分開存放yuv三個分量,就像是乙個三維平面一樣。yuv pixel formats nv12和nv21屬於y...
YUV格式詳解
工作中經常會使用一些顏色空間,最主要的就是使用rgb空間和yuv空間,把兩空間的一些知識記錄在此。在圖中,你可以看到4 4 4格式的亮度 色度取樣分布。就像圖中所表示的,畫面中每個象素都有與之對應的色度和亮度取樣資訊。其次就是4 2 2,就是說,每4點y取樣,就有2點cb和2點cr。在這種格式中,色...