Opencv 如何在没有默认YUV2RGB的情况下从H264 4:2:0视频中读取Y分量->;RGB2灰度转换
我需要快速处理灰度帧,因此我只需要YUV 4:2:0视频中的Y分量。正如我从分析器中看到的,很多时间都浪费在无用的YUV->RGB转换上Opencv 如何在没有默认YUV2RGB的情况下从H264 4:2:0视频中读取Y分量->;RGB2灰度转换,opencv,video,opencl,h.264,Opencv,Video,Opencl,H.264,我需要快速处理灰度帧,因此我只需要YUV 4:2:0视频中的Y分量。正如我从分析器中看到的,很多时间都浪费在无用的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_PRO
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并查看,其中需要
视频解码\u示例
功能。在它的主体中,第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平面存储在
图片->数据[0]
中。将它复制到OpenCL内存对象,就这样。您是否处理常规视频文件?没有涉及简历?是的,这是我拥有的100多个常规视频文件中的一个——从互联网上看一到两个小时的电影。没有涉及简历。我确信它是由ffmpeg编码的。你是否曾经在4:2:0的电影中使用过CV\u CAP\u PROP\u CONVERT\u RGB标志?正如我在这里发现的。是的,我在问我的问题之前看到了,谢谢。当然,ffmpeg lib是一个决定。但是只使用openCV函数更方便,而且它还是使用openCV_ffmpeg.dll。好吧,似乎没有openCV唯一的方法,至少只要是打开的(我仍然不确定它是否真的是bug)。我认为你的答案很有用,但相信有人会教我们openCV解决这个问题的唯一方法。