關於yuv的問題..... |
答題得分者是:JerryKuo
|
even
一般會員 發表:12 回覆:17 積分:5 註冊:2003-07-18 發送簡訊給我 |
input檔為一qcif.yuv(4,1,1)176*144的檔案....
frame數為450張...現在想由pBitmap來秀出每一張frame...
程式碼如下..
y =Yraw2array(FileName.c_str(),w, h, frame_no);//取出Y的raw data u =Uraw2array(FileName.c_str(),w, h, frmae_no);//取出U的raw data v =Vraw2array(FileName.c_str(),w, h, frame_no);//取出V的raw data array2bmp(y,u,v,w,h,pBitmap); //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ void array2bmp(int *y,int *u,int *v,int w,int h,Graphics::TBitmap *bmp) { Byte *ptr; float R,G,B; bmp->Height=h; bmp->Width=w; for(int y=0;y |
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
|
even
一般會員 發表:12 回覆:17 積分:5 註冊:2003-07-18 發送簡訊給我 |
|
brook
資深會員 發表:57 回覆:323 積分:371 註冊:2002-07-12 發送簡訊給我 |
|
even
一般會員 發表:12 回覆:17 積分:5 註冊:2003-07-18 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
你好: 我有幾個問題,你先試試改看看
1.在array2bmp()函數裡,輸入值y,u,v。結果y被拿來當index,反而是出現g這個
陣列,這compiler會過嗎?..
2.來源檔案是176x144raw_data,YUV比例是4:1:1,所以Y檔的像素應為176x144
U和V分別是44x36。讀檔時要注意
3.假設讀檔成功,在使用上,是4個Y搭配一對UV,舉個例,也就是(0,0),(1,0),
(0,1),(1,1)四個點的Y值,搭配(0,0)的U和V值。在你的程式好像沒有用到這
幾個設定。 試試看吧
引言: input檔為一qcif.yuv(4,1,1)176*144的檔案.... frame數為450張...現在想由pBitmap來秀出每一張frame... 程式碼如下..y =Yraw2array(FileName.c_str(),w, h, frame_no);//取出Y的raw data u =Uraw2array(FileName.c_str(),w, h, frmae_no);//取出U的raw data v =Vraw2array(FileName.c_str(),w, h, frame_no);//取出V的raw data array2bmp(y,u,v,w,h,pBitmap); //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ void array2bmp(int *y,int *u,int *v,int w,int h,Graphics::TBitmap *bmp) { Byte *ptr; float R,G,B; bmp->Height=h; bmp->Width=w; for(int y=0;y |
even
一般會員 發表:12 回覆:17 積分:5 註冊:2003-07-18 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
|
brook
資深會員 發表:57 回覆:323 積分:371 註冊:2002-07-12 發送簡訊給我 |
引言: 3.假設讀檔成功,在使用上,是4個Y搭配一對UV,舉個例,也就是(0,0),(1,0), (0,1),(1,1)四個點的Y值,搭配(0,0)的U和V值。在你的程式好像沒有用到這 幾個設定。 int* Yraw2array(char* FileName, int w, int h, int frame_no) { int* temp1 = new int[w*h]; // 假如是4份的話應該多乘4 unsigned char* temp2 =new unsigned char[w*h*4]; FILE* p; p=fopen(FileName,"rb"); fseek(p,frame_no*w*h,SEEK_SET); // 假如是4份的話 fread(temp2,w*h,4,p); for(int a=0;a |
even
一般會員 發表:12 回覆:17 積分:5 註冊:2003-07-18 發送簡訊給我 |
修改了下...
程式如下...
f =Yraw2array(FileName.c_str(),w, h, frame_no); u =Uraw2array(FileName.c_str(),w, h, frame_no); v =Vraw2array(FileName.c_str(),w, h, frame_no); array2bmp(f,u,v,w,h,pBitmap); bmp_disp(pBitmap,Image1); //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ int* Yraw2array(char* FileName, int w, int h, int frame_no) { int* temp1 = new int[w*h]; unsigned char* temp2 =new unsigned char[w*h]; FILE* p; p=fopen(FileName,"rb"); fseek(p,frame_no*w*h*1.5,SEEK_SET); fread(temp2,w*h,1,p); for(int a=0;a麻煩各位大大幫幫忙...... 看看是那寫錯了.. 謝謝.... |
brook
資深會員 發表:57 回覆:323 積分:371 註冊:2002-07-12 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
even你好 可以請你寄一個你的測試圖給我嗎?...我發現你的YUV->RGB公式
好像有些誤差,我用的公式如下,至少正確度90%,呵呵
B = Y + 2.032*(U - 128) G = Y - 0.395*(U - 128) - 0.581*(V - 128) R = Y + 1.140*(V - 128)不過我這個公式開出來的圖有10%暇庇,如圖左上角 我查了一下網路的YUV->RGB公式,大部分都是RGB->YUV 所以當要做YUV->RGB時,就要根據RGB->YUV是如何轉換的 才能用反矩陣將YUV轉換RGB。 我用的是視訊壓縮標準的參考圖,原始圖就是YUV,並不是 RGB轉換而來的,我的轉換式是試過數種YUV->RGB公式,得 到結果最好的一個式子,我想MPEG應該有標準的YUV->RGB 我會再查看看H.263有沒有這個式子(但書再遙遠的家鄉) 參考看看吧 |
even
一般會員 發表:12 回覆:17 積分:5 註冊:2003-07-18 發送簡訊給我 |
謝謝各位大大的熱情的幫忙....
問題已經解決了...^^
嘿嘿...
果然是公式的運算有問題.....
還有y檔與u、v檔的對應問題.......
程式碼如下.....
int* Yrawarray(char* FileName, int w, int h, int frame_no) { int* temp1 = new int[w*h]; unsigned char* temp2 =new unsigned char[w*h]; FILE* p; p=fopen(FileName,"rb"); fseek(p,frame_no*w*h*1.5,SEEK_SET); fread(temp2,w*h,1,p); for(int a=0;a再次謝謝JerryKuo大大及brook的幫忙囉......... |
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
|
hclnsmsimsmsim
一般會員 發表:0 回覆:1 積分:0 註冊:2006-12-04 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |