[問題] BMP to YUV過程是否那邊出錯!?(已解決)
遇到的問題:
請問各位先進,目前我將BMP取RGB之後轉換成YUV444,之後又轉YV12。
但是目前出問題的是除了Y是正確的之外,UV應該有嚴重的失真現像。
1.BMP取RGB:
BMP:176*144。
由下至上取,左至右取B、G、R。
2.RGB to YUV444:
利用wiki給的公式轉換。
Y = 0.299*R + 0.587*G +0.114*b
U = -0.14713*R - 0.28886*G + 0.436*B
V = 0.615*R - 0.51499*G - 0.10001*B
資料存放為先Y然後U再V!?
3.YV12:
將2X2陣列的U平均取一值。
將2X2陣列的V平均取一值。
資料存放同2.
希望得到的正確結果:
解決失真現像。
程式跑出來的錯誤結果:
UV失真。
開發平台:
VC++ & Dev C++。
有問題的code:
1.取出RGB
if(BMP_File){
fseek(BMP_File, 54, SEEK_SET);
for(i = *BMP_Height -1 ; i >= 0; i--){
for(j = 0; j < *BMP_Width; j++){
fread(&B_Space[i][j], 1, 1, BMP_File);
fread(&G_Space[i][j], 1, 1, BMP_File);
fread(&R_Space[i][j], 1, 1, BMP_File);
}
}
}
2.RGB to YUV444
for(nH = 0; nH < *BMP_Height; nH++)
for(nW =0; nW < *BMP_Width; nW++){
Y_Space[nH][nW] = 0.299 * (float)R_Space[nH][nW] + 0.587 * (float)G_Space[nH][nW] + 0.144 * (float)B_Space[nH][nW];
U_Space[nH][nW] = (-0.14713) * (float)R_Space[nH][nW] - 0.28886 * (float)G_Space[nH][nW] + 0.436 * (float)B_Space[nH][nW];
V_Space[nH][nW] = (0.615) * (float)R_Space[nH][nW] - 0.51499 * (float)G_Space[nH][nW] - 0.10001 * (float)B_Space[nH][nW];
}
3.YUV444 to YV12
for(nH = 0, nH1 = 0; nH < *BMP_Height; nH += 2, nH1++)
for(nW = 0, nW1 = 0; nW < *BMP_Width; nW += 2, nW1++){
U1_Space[nH1][nW1] = (U_Space[nH][nW] + U_Space[nH][nW + 1] + U_Space[nH +1][nW] + U_Space[nH + 1][nW + 1]) / 4;
V1_Space[nH1][nW1] = (V_Space[nH][nW] + V_Space[nH][nW + 1] + V_Space[nH +1][nW] + V_Space[nH + 1][nW + 1]) / 4;
}
補充說明:
抱歉,初學有問題請多多見諒。
謝謝
-----------------------------------------------------------------------
感謝LittleBob大的指點,
在UV轉換後的數值後面+128即可。
謝謝!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.240.245.74
※ 編輯: MaconChou 來自: 210.240.245.74 (05/22 19:52)
※ 編輯: MaconChou 來自: 210.240.245.74 (05/22 20:21)
※ 編輯: MaconChou 來自: 210.240.245.74 (05/22 20:25)
※ 編輯: MaconChou 來自: 210.240.245.74 (05/22 20:26)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章