1. 程式人生 > >論YUV422(YUYV)與YUV420相互轉換

論YUV422(YUYV)與YUV420相互轉換

Example 2.13. V4L2_PIX_FMT_YUYV 4 × 4 pixelimage

start + 0:

Y'00

Cb00

Y'01

Cr00

Y'02

Cb01

Y'03

Cr01

start + 8:

Y'10

Cb10

Y'11

Cr10

Y'12

Cb11

Y'13

Cr11

start + 16:

Y'20

Cb20

Y'21

Cr20

Y'22

Cb21

Y'23

Cr21

start + 24:

Y'30

Cb30

Y'31

Cr30

Y'32

Cb31

Y'33

Cr31

YUV422碼流存放位置

Example 2.18. V4L2_PIX_FMT_YUV420 4 × 4 pixelimage

start + 0:

Y'00

Y'01

Y'02

Y'03

start + 4:

Y'10

Y'11

Y'12

Y'13

start + 8:

Y'20

Y'21

Y'22

Y'23

start + 12:

Y'30

Y'31

Y'32

Y'33

start + 16:

Cb00

Cb01

start + 18:

Cb10

Cb11

start + 20:

Cr00

Cr01

start + 22:

Cr10

Cr11

YUV420碼流存放位置

這裡要順帶提一下YUV444,既無損YUV色彩空間.一個Y帶一個Cb一個Cr,即YCbCr.

YUV422取樣即從YUV444基礎上,從第一個Y開始只保留Cb,剔去Cr,第二個Y只保留Cr剔去Cb…...這樣交替取樣,長度大小為width*height*2,Y:U:V=4:2:2,一個色彩分量佔一個位元組.

而YUV420即從YUV422基礎上進行隔行取樣,例如第一行只保留Cb,第二行只保留Cr……這樣交替進行,Y:U:V=4:2:0並不是沒有V分量,也可以是Y:U:V=4:0:2.相信這樣大家容易理解.最後在這個基礎上,把Y,U,V三種分量打包排列,即如上圖,長度大小為width*height*3/2.

說了這麼多,是時候貼上具體程式碼.

  1. <span style="font-size:14px;">#include <stdio.h>  
  2. #include <string.h>  
  3. #define     READ_WRITE_FILE_SIZE    176*144*2  //YUV422 影象解析度為177x144  
  4. unsigned char filebuf[38017] = {0};  
  5. int YUV422To420(unsigned char yuv422[], unsigned char yuv420[], int width, int height)  
  6. {          
  7.        int ynum=width*height;  
  8.        int i,j,k=0;  
  9.     //得到Y分量  
  10.        for(i=0;i<ynum;i++){  
  11.            yuv420[i]=yuv422[i*2];  
  12.        }  
  13.     //得到U分量  
  14.        for(i=0;i<height;i++){  
  15.            if((i%2)!=0)continue;  
  16.            for(j=0;j<(width/2);j++){  
  17.                if((4*j+1)>(2*width))break;  
  18.                yuv420[ynum+k*2*width/4+j]=yuv422[i*2*width+4*j+1];  
  19.                        }  
  20.             k++;  
  21.        }  
  22.        k=0;  
  23.     //得到V分量  
  24.        for(i=0;i<height;i++){  
  25.            if((i%2)==0)continue;  
  26.            for(j=0;j<(width/2);j++){  
  27.                if((4*j+3)>(2*width))break;  
  28.                yuv420[ynum+ynum/4+k*2*width/4+j]=yuv422[i*2*width+4*j+3];  
  29.            }  
  30.             k++;  
  31.        }  
  32.        return 1;  
  33. }  
  34. int main(void)  
  35. {  
  36.     int len = 0;  
  37.     FILE *fpr, *fpw;  
  38.     unsigned char buf[READ_WRITE_FILE_SIZE];  
  39.     fpr = fopen( "WEBCAM-00012.YUV", "rb" );  
  40.     fpw = fopen( "yuyv_2_yy_u_v.yuv", "wb" );  
  41.     if( fpr == NULL || fpw == NULL )  
  42.     {  
  43.         printf("can not read or write file\n");  
  44.         fcloseall();  
  45.         return 1;  
  46.     }  
  47.     fread( buf, READ_WRITE_FILE_SIZE, 1, fpr );  
  48.     if(YUV422To420(buf,filebuf,176,144))printf("ok\n");  
  49.     printf("size:%d",sizeof(filebuf));  
  50.     fwrite( &filebuf, sizeof(filebuf), 1, fpw );  
  51.     fcloseall();  
  52.     return 0;  
  53. }  
  54. </span>  
  1. <span style="font-size:14px;">#include <stdio.h>  
  2. #include <string.h>  
  3. #define     READ_WRITE_FILE_SIZE    176*144*2  //YUV422 影象解析度為177x144  
  4. unsigned char filebuf[38017] = {0};  
  5. int YUV422To420(unsigned char yuv422[], unsigned char yuv420[], int width, int height)  
  6. {          
  7.        int ynum=width*height;  
  8.        int i,j,k=0;  
  9.     //得到Y分量  
  10.        for(i=0;i<ynum;i++){  
  11.            yuv420[i]=yuv422[i*2];  
  12.        }  
  13.     //得到U分量  
  14.        for(i=0;i<height;i++){  
  15.            if((i%2)!=0)continue;  
  16.            for(j=0;j<(width/2);j++){  
  17.                if((4*j+1)>(2*width))break;  
  18.                yuv420[ynum+k*2*width/4+j]=yuv422[i*2*width+4*j+1];  
  19.                        }  
  20.             k++;  
  21.        }  
  22.        k=0;  
  23.     //得到V分量  
  24.        for(i=0;i<height;i++){  
  25.            if((i%2)==0)continue;  
  26.            for(j=0;j<(width/2);j++){  
  27.                if((4*j+3)>(2*width))break;  
  28.                yuv420[ynum+ynum/4+k*2*width/4+j]=yuv422[i*2*width+4*j+3];  
  29.            }  
  30.             k++;  
  31.        }  
  32.        return 1;  
  33. }  
  34. int main(void)  
  35. {  
  36.     int len = 0;  
  37.     FILE *fpr, *fpw;  
  38.     unsigned char buf[READ_WRITE_FILE_SIZE];  
  39.     fpr = fopen( "WEBCAM-00012.YUV", "rb" );  
  40.     fpw = fopen( "yuyv_2_yy_u_v.yuv", "wb" );  
  41.     if( fpr == NULL || fpw == NULL )  
  42.     {  
  43.         printf("can not read or write file\n");  
  44.         fcloseall();  
  45.         return 1;  
  46.     }  
  47.     fread( buf, READ_WRITE_FILE_SIZE, 1, fpr );  
  48.     if(YUV422To420(buf,filebuf,176,144))printf("ok\n");  
  49.     printf("size:%d",sizeof(filebuf));  
  50.     fwrite( &filebuf, sizeof(filebuf), 1, fpw );  
  51.     fcloseall();  
  52.     return 0;  

相關推薦

YUV422(YUYV)YUV420相互轉換

Example 2.13. V4L2_PIX_FMT_YUYV 4 × 4 pixelimage start + 0: Y'00 Cb00 Y'01 Cr00 Y'02 Cb01 Y'03 Cr01

YUV420RGB24相互轉換c++純程式碼

一幀YUV420P畫素資料一共佔用w*h*3/2 Byte的資料。其中前w*h Byte儲存Y,接著的w*h*1/4 Byte儲存U,最後w*h*1/4 Byte儲存VRGB到YUV的轉換公式:Y= 0.299*R+0.587*G+0.114*BU=-0.147*R-0.

將字典轉換成變量, 字符串列表相互轉換

div 變量 pda span locals split blog nbsp tr1 將字典轉換成變量: >>> locals().update({‘a‘:1,‘b‘:2}) >>> a 1 >>> b 2 字符串與

Linux下ffmpeg的wavamr相互轉換

++ mpi 資料 linux href attr south 失敗 引用 轉載:http://blog.csdn.net/sanshipianyezi/article/details/78742621 轉載:http://blog.csdn.net/szfhy/arti

JAVA 實現XMLJSON 相互轉換

tst throws light getc con parent urn In 工作 原文地址https://blog.csdn.net/congcong68/article/details/39029907 在工作中,經常碰到XML轉為JSON或者JSON轉為XML,在這

C#.net開發 ListDataTable相互轉換

inf columns serve property eat 這一 異常 bject 屬性 1、DataTable轉List集合 /// <summary> /// DataTable轉化為List集合 ///

python 列表字典相互轉換

bubuko 內置函數 sin 技術 for 分享圖片 ima 字符 復數類 1. 2個列表轉換為字典 #encoding=utf-8list1=["a","b","c"]list2=[1,2,3]d={}for i in range(len(list1)): d[l

java字元陣列字串相互轉換

1.字串轉化為字元陣列 public class Hello { public static void main(String args[]){ Scanner input = new Scanner(System.in); String str="abc";

C語言字串數字相互轉換

在C/C++語言中沒有專門的字串變數,通常用字元陣列來存放字串。字串是以“\0”作為結束符。C/C++提供了豐富的字串處理函式,下面列出了幾個最常用的函式。   ● 字串輸出函式puts。   ● 字串輸出函式gets。   ●

vb netc 相互轉換工具

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

php 陣列URL相互轉換

php為了陣列與url引數相互轉換提供了兩個函式: 1,陣列轉換為帶&的URL的字串   例如: $arr =['title'=>'我是小白','name'=>'真的很白','text'=>'但是決不放棄'];$res =urldecode(http_build_query($

markdownword相互轉換

markdown文字轉換成word步驟如下 首先,下載typora,一路安裝即可。網址為: http://www.softpedia.com/get/Internet/WEB-Design/HTML-Editors/Typora.shtml 下載pandoc,一路安裝即可,網址為

2.6 使用for迴圈遍歷檔案 2.7 使用while迴圈遍歷檔案 2.8 統計系統剩餘的記憶體 2.9 資料型別轉換計算(計算mac地址) 3.0 資料型別轉換(列表字典相互轉換

2.6 使用for迴圈遍歷檔案 open r:以只讀方式開啟 w: 以寫方式開啟 a: 以追加模式開啟 r+: 以讀寫模式開啟 w+: 以讀寫模式開啟(參見w) a+: 以讀寫模式開啟(參見a) rb: 以二進位制模式開啟 read 我們先寫一個檔案,叫1.txt 內容如下 111 22

java型別 7bit位元組String 相互轉換

在通訊GSM,俗稱的2G 通常採用的是7bit編碼,是一種7位編碼壓縮演算法,其實原理上來說一個位元組佔8個位元位,一般最高位都是符號運算位 ,通常忽略不計,7bit其實就是運用了最高位將位元組往前移一位 就能空出一個位元位來給下個位元組用,也就是說8個位元組  之前的話 64位位元位來表

C#實體類XML相互轉換

1、實體類與XML相互轉換 將實體類轉換成XML需要使用XmlSerializer類的Serialize方法,將實體類序列化。 把XML轉換成相應的實體類,需要使用到XmlSerializer類的Deserialize方法,將XML進行反序列化。 建立XML序列化公共處理類(XmlS

solidity智慧合約[42]-memorystorage相互轉換

memory 賦值 狀態變數 下面的例子說明了memory賦值給storage的情況。在test函式中,memory空間的變數s複製給了狀態變數stu。為值的拷貝問題。並且由於這兩個空間互不影響。因此修改變數的值不會影響到另一個變數的值。當呼叫call函式時,返回100,"jonson"。s的修改不會影

Java整型字串相互轉換

1如何將字串 String 轉換成整數 int?   A. 有兩個方法:   1). int i = Integer.parseInt([String]); 或   i = Integer.parseInt([String],[int radix]);   2). int i = I

C/C++ 字串數字相互轉換

https://www.cnblogs.com/happygirl-zjj/p/4633789.html 一.利用stringstream類 字串到整數 stringstream sstr(str); int x; sstr >> x;(即從sstr中提取資料)

mysql 時間字串相互轉換

select str_to_date('2018-02-23 15:01:51', '%Y-%m-%d %H:%i:%s') date; date_format(date,format):時間轉字串 select date_format(now(), '%Y-%m-%d') str;

java中intbyte相互轉換

基礎內容簡介      在做轉換之前先要明確幾個簡單的概念。首先本文是以java為語言,以int為例子。 long資料型別在原理上是一致的。      1  int 在java中是32位, byte是8位。      2  原碼,反碼,補碼簡介