2014-09-18 78 views
0

我需要快速處理灰度幀,因此我只需要YUV 4:2:0視頻中的Y分量我有。正如我從剖析器中看到的,很多時間都在浪費無用的YUV-> RGB轉換。如何從H264 4:2:0視頻讀取Y分量YUV2RGB-> RGB2GRAY轉換

VideoCapture::cap.set(CV_CAP_PROP_CONVERT_RGB, false) 

給沒有影響,因爲我可以從分裂

Mat ch[3]; split(frame,ch); imshow("it must be U-channel", ch[1]); 

幀看仍處於RGB,不YUV,即VideoCapture 忽略 CV_CAP_PROP_CONVERT_RGB標誌(我相信的ffmpeg庫所使用的OpenCV的對於視頻解碼可以理解這種標誌)。

那麼,請問有人知道如何更快地從視頻序列中獲取灰度圖像嗎? OpenCL方法也可以,因爲我將Mat轉換爲oclMat以在讀取後處理這些幀(包括當前無用的ocl :: cvtColor(A,B,CV_RGB2GRAY))。

+0

你是否處理普通視頻文件?沒有簡歷參與? – 2014-09-19 08:51:08

+0

是的,它是我擁有的常規視頻文件之一 - 僅需1-2小時從互聯網上觀看的電影。沒有涉及簡歷。我確定它是由ffmpeg編碼的。你有沒有從CV_CAP_PROP_CONVERT_RGB標誌與4:2:0電影中的任何一個一起工作?正如我在這裏發現這[相機問題是相同的](http://stackoverflow.com/questions/21881299/get-grayscale-image-directly-from-webcam-using-opencv)。 – 2014-09-19 09:33:02

回答

2

對於普通的視頻解碼,你不需要OpenCV。它可以用ffmpeg庫來完成。下載&構建最新版本的ffmpeg &看看sample,其中你需要video_decode_example函數。在它的身體,在線401:

if (got_picture) { 
    printf("saving frame %3d\n", frame); 
    fflush(stdout); 

    /* the picture is allocated by the decoder. no need to free it */ 
    snprintf(buf, sizeof(buf), outfilename, frame); 
    pgm_save(picture->data[0], picture->linesize[0], c->width, c->height, buf); 
    frame++; 
} 

如ffmpeg的工作原理與的Y Cb Cr顏色表示,解碼幀的Y平面被存儲在picture->data[0]。將它複製到你的OpenCL內存對象,就是這樣。

+0

是的,我在問我的問題之前看到[您的回答](http://stackoverflow.com/questions/20953729/opencl-video-processing),謝謝。當然,ffmpeg lib是一個決定。但是隻使用openCV函數更方便,並且無論如何它都使用opencv_ffmpeg.dll。那麼,似乎沒有openCV-only-way,至少只要[這個bug](http://code.opencv.org/issues/3909)被打開(我仍然不確定它是否真的是bug)。我認爲你的答案是有用的,但相信有人會教我們openCV的方式來解決這個問題。 – 2014-09-19 13:10:39