昨晚參考其它blog,將之前的SDL框架的顯示改成了opencv顯示。結(jié)果學(xué)習(xí)過程中遇到2個(gè)bug滩愁,結(jié)果都順利解決,主要是圖像格式轉(zhuǎn)換問題辫封。
問題1
顯示變色
通過vs2017中調(diào)試硝枉,對(duì)比正常變色的數(shù)據(jù),發(fā)現(xiàn)rgb和bgr顛倒了
cv::Mat frameImage(cv::Size(width, height), CV_8UC3, cv::Scalar(0));
stepWidth = frameImage.step;
nChannels = frameImage.channels();
pData = frameImage.data;
//frameImage.data = pFrame->data[0];
#if 1
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
pData[i * stepWidth + j * nChannels + 0] = pFrame->data[0][i * pFrame->linesize[0] + j * nChannels + 2];
pData[i * stepWidth + j * nChannels + 1] = pFrame->data[0][i * pFrame->linesize[0] + j * nChannels + 1];
pData[i * stepWidth + j * nChannels + 2] = pFrame->data[0][i * pFrame->linesize[0] + j * nChannels + 0];
}
}
#endif
cv::namedWindow("Video", CV_WINDOW_AUTOSIZE);
cv::imshow("Video", frameImage);
小結(jié):正常sws_scale函數(shù)轉(zhuǎn)換格式后倦微,應(yīng)該frameImage.data = pFrame->data[0]; 就可以通過cv::imshow顯示了妻味,不需要再進(jìn)行data賦值,此賦值代碼中把RGB和BGR進(jìn)行了轉(zhuǎn)換欣福,導(dǎo)致的變色责球。
問題2
顯示3段,而且是灰色調(diào)的拓劝,圖像也不太正常
調(diào)試數(shù)據(jù)
0x00000292744DD080 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 ...................
0x00000292744DD093 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 ...................
0x00000292744DD0A6 12 12 12 12 12 12 12 12 12 12 13 13 13 13 13 13 13 13 13 ...................
0x00000292744DD0B9 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ...................
0x00000292744DD0CC 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ...................
0x00000292744DD0DF 13 13 13 13 13 13 13 13 13 13 13 13 13 14 14 14 14 14 14 ...................
0x00000292744DD0F2 14 14 14 15 14 14 15 15 15 15 15 15 16 16 15 16 16 16 16 ...................
0x00000292744DD105 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 ...................
0x00000292744DD118 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 ...................
0x00000292744DD12B 17 17 16 19 18 18 1c 1b 1a 1e 1e 1d 20 20 1f 20 20 20 21 ............ . !
0x00000292744DD13E 21 20 21 21 21 21 21 21 20 21 21 20 20 20 20 20 20 21 21 ! !!!!!! !! !!
0x00000292744DD151 20 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 !!!!!!!!!!!!!!!!!!
0x00000292744DD164 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 !!!!!!!!!!!!!!!!!!!
0x00000292744DD177 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 !!!!!!!!!!!!!!!!!!!
0x00000292744DD18A 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 !!!!!!!!!!!!!!!!!!!
0x00000292744DD19D 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 !!!!!!!!!!!!!!!!!!!
0x00000292744DD1B0 21 21 21 21 21 21 21 21 21 21 21 21 21 21 22 21 21 22 22 !!!!!!!!!!!!!!"!!""
0x00000292744DD1C3 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 """""""""""""""""""
問題分析:因?yàn)閳D像轉(zhuǎn)換的時(shí)候都用了AV_PIX_FMT_YUV420P雏逾,而此格式是planar。而把3個(gè)byte的Y(灰度)數(shù)據(jù)給了合并為一個(gè)RGB數(shù)據(jù)郑临,導(dǎo)致看上去有3片灰色的
YUV420 planar數(shù)據(jù)校套, 以720×488大小圖象YUV420 planar為例,
其存儲(chǔ)格式是: 共大小為(720×480×3>>1)字節(jié)牧抵,
分為三個(gè)部分:Y,U和V
Y分量: (720×480)個(gè)字節(jié)
U(Cb)分量:(720×480>>2)個(gè)字節(jié)
V(Cr)分量:(720×480>>2)個(gè)字節(jié)
三個(gè)部分內(nèi)部均是行優(yōu)先存儲(chǔ),三個(gè)部分之間是Y,U,V 順序存儲(chǔ)。
即YUV數(shù)據(jù)的0--720×480字節(jié)是Y分量值犀变,
720×480--720×480×5/4字節(jié)是U分量
720×480×5/4 --720×480×3/2字節(jié)是V分量妹孙。
sws_scale經(jīng)過YUV轉(zhuǎn)換后的數(shù)組有3個(gè),一個(gè)是Y數(shù)組获枝,一個(gè)是U數(shù)組蠢正,一個(gè)是V數(shù)組。而進(jìn)入RGB轉(zhuǎn)換數(shù)組只有1個(gè),存儲(chǔ)方式是RGB交叉排列的
找到根本原因后省店,問題順利解決嚣崭。
參考網(wǎng)址
1.圖像原始格式(YUV444 YUV422 YUV420)一探究竟
2.yuv422/yuv420格式