我需要快速处理灰度帧,因此我只需要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内存对象中,就这样。