Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 如何在没有默认YUV2RGB的情况下从H264 4:2:0视频中读取Y分量->;RGB2灰度转换_Opencv_Video_Opencl_H.264 - Fatal编程技术网

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

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

我需要快速处理灰度帧,因此我只需要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_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解决这个问题的唯一方法。