論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.
說了這麼多,是時候貼上具體程式碼.
- <span style="font-size:14px;">#include <stdio.h>
- #include <string.h>
- #define READ_WRITE_FILE_SIZE 176*144*2 //YUV422 影象解析度為177x144
- unsigned char filebuf[38017] = {0};
- int YUV422To420(unsigned char yuv422[], unsigned char yuv420[], int width, int height)
- {
- int ynum=width*height;
- int i,j,k=0;
- //得到Y分量
- for(i=0;i<ynum;i++){
- yuv420[i]=yuv422[i*2];
- }
- //得到U分量
- for(i=0;i<height;i++){
- if((i%2)!=0)continue;
- for(j=0;j<(width/2);j++){
- if((4*j+1)>(2*width))break;
- yuv420[ynum+k*2*width/4+j]=yuv422[i*2*width+4*j+1];
- }
- k++;
- }
- k=0;
- //得到V分量
- for(i=0;i<height;i++){
- if((i%2)==0)continue;
- for(j=0;j<(width/2);j++){
- if((4*j+3)>(2*width))break;
- yuv420[ynum+ynum/4+k*2*width/4+j]=yuv422[i*2*width+4*j+3];
- }
- k++;
- }
- return 1;
- }
- int main(void)
- {
- int len = 0;
- FILE *fpr, *fpw;
- unsigned char buf[READ_WRITE_FILE_SIZE];
- fpr = fopen( "WEBCAM-00012.YUV", "rb" );
- fpw = fopen( "yuyv_2_yy_u_v.yuv", "wb" );
- if( fpr == NULL || fpw == NULL )
- {
- printf("can not read or write file\n");
- fcloseall();
- return 1;
- }
- fread( buf, READ_WRITE_FILE_SIZE, 1, fpr );
- if(YUV422To420(buf,filebuf,176,144))printf("ok\n");
- printf("size:%d",sizeof(filebuf));
- fwrite( &filebuf, sizeof(filebuf), 1, fpw );
- fcloseall();
- return 0;
- }
- </span>
- <span style="font-size:14px;">#include <stdio.h>
- #include <string.h>
- #define READ_WRITE_FILE_SIZE 176*144*2 //YUV422 影象解析度為177x144
- unsigned char filebuf[38017] = {0};
- int YUV422To420(unsigned char yuv422[], unsigned char yuv420[], int width, int height)
- {
- int ynum=width*height;
- int i,j,k=0;
- //得到Y分量
- for(i=0;i<ynum;i++){
- yuv420[i]=yuv422[i*2];
- }
- //得到U分量
- for(i=0;i<height;i++){
- if((i%2)!=0)continue;
- for(j=0;j<(width/2);j++){
- if((4*j+1)>(2*width))break;
- yuv420[ynum+k*2*width/4+j]=yuv422[i*2*width+4*j+1];
- }
- k++;
- }
- k=0;
- //得到V分量
- for(i=0;i<height;i++){
- if((i%2)==0)continue;
- for(j=0;j<(width/2);j++){
- if((4*j+3)>(2*width))break;
- yuv420[ynum+ynum/4+k*2*width/4+j]=yuv422[i*2*width+4*j+3];
- }
- k++;
- }
- return 1;
- }
- int main(void)
- {
- int len = 0;
- FILE *fpr, *fpw;
- unsigned char buf[READ_WRITE_FILE_SIZE];
- fpr = fopen( "WEBCAM-00012.YUV", "rb" );
- fpw = fopen( "yuyv_2_yy_u_v.yuv", "wb" );
- if( fpr == NULL || fpw == NULL )
- {
- printf("can not read or write file\n");
- fcloseall();
- return 1;
- }
- fread( buf, READ_WRITE_FILE_SIZE, 1, fpr );
- if(YUV422To420(buf,filebuf,176,144))printf("ok\n");
- printf("size:%d",sizeof(filebuf));
- fwrite( &filebuf, sizeof(filebuf), 1, fpw );
- fcloseall();
- 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
YUV420與RGB24相互轉換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的wav與amr相互轉換
++ mpi 資料 linux href attr south 失敗 引用 轉載:http://blog.csdn.net/sanshipianyezi/article/details/78742621 轉載:http://blog.csdn.net/szfhy/arti
JAVA 實現XML與JSON 相互轉換
tst throws light getc con parent urn In 工作 原文地址https://blog.csdn.net/congcong68/article/details/39029907 在工作中,經常碰到XML轉為JSON或者JSON轉為XML,在這
C#.net開發 List與DataTable相互轉換
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 net與c 相互轉換工具
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
php 陣列與URL相互轉換
php為了陣列與url引數相互轉換提供了兩個函式: 1,陣列轉換為帶&的URL的字串 例如: $arr =['title'=>'我是小白','name'=>'真的很白','text'=>'但是決不放棄'];$res =urldecode(http_build_query($
markdown與word相互轉換
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]-memory與storage相互轉換
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中int與byte相互轉換
基礎內容簡介 在做轉換之前先要明確幾個簡單的概念。首先本文是以java為語言,以int為例子。 long資料型別在原理上是一致的。 1 int 在java中是32位, byte是8位。 2 原碼,反碼,補碼簡介