2 回答

TA貢獻1806條經(jīng)驗 獲得超5個贊
OpenCV的話:YUV->IplImage->縮放->轉(zhuǎn)換回YUV可參考:YUV轉(zhuǎn)IPLImage(RGB)或者使用ffmpeg的swscale可以直接實現(xiàn)可參考:FFMPEG 實現(xiàn) YUV,RGB各種圖像原始數(shù)據(jù)之間的轉(zhuǎn)換(swscale)

TA貢獻1776條經(jīng)驗 獲得超12個贊
最近在做視頻濃縮的項目。以前一直用OpenCV這項神器輔助編程,然而發(fā)現(xiàn)opencv在視頻的壓縮編碼和寫入封裝上有些弊端和小bug。比如壓縮比很小,無法寫入生成過大的文件,格式封裝不完美。所以在下又去尋求另一個開源庫ffmpeg的幫助。
講道理,ffmpeg比opencv學起來更費勁。版本更新?lián)Q代太快,網(wǎng)上也沒用成體系的教程資料,所以只有去大嬸們的博客去取經(jīng),溜了幾圈受益匪淺。不得不說這個庫很厲害,有完整的視頻編解碼方案,解決了之前生成的視頻文件太大的問題。
由于用到了opencv封裝的一些算法,所以我對每一幀圖像使用的是opencv的Mat數(shù)據(jù)結(jié)構(gòu)。然而ffmpeg編碼視頻要求輸入是YUV,那么問題來了,我怎么把這兩個庫數(shù)據(jù)結(jié)構(gòu)對接上?查找了一些資料,不管你是什么數(shù)據(jù)結(jié)構(gòu),都得從像素級別處理圖像,所以可以從內(nèi)存地址下功夫。下面是我的代碼
[cpp] view plain copy
memcpy(pYuvBuf, Img.data, bufLen*sizeof(unsigned char));
pict->data[0] = pYuvBuf; // Y
pict->data[1] = pYuvBuf + y_size; // U
pict->data[2] = pYuvBuf + y_size * 5 / 4; // V
其中Img為Mat結(jié)構(gòu)。
- 2 回答
- 0 關注
- 2952 瀏覽
添加回答
舉報