如何在没有默认YUV2RGB->RGB2GRAY转换的情况下从 H264 4:2:0 视频中读取 Y 分量



我需要快速处理灰度帧,因此我只需要YUV 4:2:0视频中的Y分量。正如我从profiler中看到的,很多时间都浪费在无用的YUV->RGB转换上。

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标志(我相信openCV用于视频解码的ffmpeg库可以理解此类标志)。

所以,有人知道如何更快地从视频序列中获得灰度图像吗?OpenCL方法也可以,因为我在读取后将Mat转换为oclMat来处理这些帧(包括当前无用的ocl::cvtColor(A,B,CV_RGB2GRAY))。

对于常规视频解码,您不需要OpenCV。这可以用ffmpeg库来完成。下载&构建最新版本的ffmpeg&看看示例,其中需要video_decode_example函数。在它的身体里,在401行:

if (got_picture) {
    printf("saving frame %3dn", 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内存对象中,就这样。

最新更新