Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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 如何选择完整帧(未压缩)作为VideoWriter的编解码器_Opencv_Kinect_Video Capture_Emgucv_Codec - Fatal编程技术网

Opencv 如何选择完整帧(未压缩)作为VideoWriter的编解码器

Opencv 如何选择完整帧(未压缩)作为VideoWriter的编解码器,opencv,kinect,video-capture,emgucv,codec,Opencv,Kinect,Video Capture,Emgucv,Codec,我想将设备中未压缩的帧存储为视频,但我需要知道如何选择“完整帧(未压缩)”作为VideoWriter的编解码器(在emgu aka openCV中) 当我像这样通过-1时,我可以从下拉菜单中选择它 VideoWriter myVideoWriter = new VideoWriter ("myVieoColor.avi", -1 , 15, videoSize, true); 但是我想自动选择全帧(未压缩)编解码器。 例如,我知道我可以通过以下方式选择Lagarith无损视频编解码器: Vid

我想将设备中未压缩的帧存储为视频,但我需要知道如何选择“完整帧(未压缩)”作为VideoWriter的编解码器(在emgu aka openCV中)

当我像这样通过-1时,我可以从下拉菜单中选择它

VideoWriter myVideoWriter = new VideoWriter ("myVieoColor.avi", -1 , 15, videoSize, true);
但是我想自动选择全帧(未压缩)编解码器。 例如,我知道我可以通过以下方式选择Lagarith无损视频编解码器:

VideoWriter myVideoWriter = new VideoWriter ("myVieoColor.avi", Emgu.CV.VideoWriter.Fourcc('L','A','G','S') , 15, videoSize, true);
但是我不知道我需要使用哪种fourcc


也许有人可以帮我解决问题,如果我们在打开此编解码器选择对话框时进入调试器,我们可以看到这是to
AVISaveOptions(…)
的结果。因此,找到所选内容的一种方法是在say上设置断点并检查
fourcc
的内容

但是,还有更简单的方法:

  • 使用GUI选择编解码器,创建一个只有一个黑色帧的虚拟视频foo.avi
  • 使用
    cv::VideoCapture
    打开foo.avi
  • cv::VideoCapture
    实例获取
    CAP\u PROP\u FOURCC
  • 解码并打印
  • [可选]创建一个只有一个黑框的虚拟视频bar.avi,并使用步骤3中确定的FOURCC代码。比较foo.avibar.avi以验证它们是否相同
  • 很抱歉,我没有使用C#/EmguCV,因此我无法提供确切的示例,但是下面的示例应该很容易移植

    C++样本 Python示例 非常感谢你

    我考虑过类似的方法,但错过了emgu中的函数(VideoWriter和Capture都没有获得get(CAP_PROB)函数,但多亏了你,我搜索了更多,找到了CvInvoke.cvevideCaptureGet函数

    现在我能够像以前一样编写视频,使用Capture类读取视频文件并使用上面的函数

    //record the Videofile with VideoWriter to "myVideoColor.avi"
    capture = new Capture("myVieoColor.avi");
    System.Diagnostics.Debug.WriteLine(CvInvoke.cveVideoCaptureGet(capture, Emgu.CV.CvEnum.CapProp.FourCC));
    
    到目前为止还不错。 当我使用LAGS作为编解码器时,一切正常,我得到1397178700,所以我可以用这个值调用构造函数

    VideoWriter myVideoWriter = new VideoWriter ("myVieoColor.avi", 1397178700 , 15, videoSize, true);
    //works great with 1397178700 == LAGS codec
    
    但当我通过-1并从下拉菜单中选择uncompressed时,它会返回0作为fourCC编解码器值,但当使用0作为构造函数参数时,它不会记录并打印808596553作为所用编解码器的值

    VideoWriter myVideoWriter = new VideoWriter ("myVieoColor.avi", 0 , 15, videoSize, true);
    //dont work and CapProb.FourCC returns 808596553
    
    从drop中选择Lagarith无损编解码器,我得到了1397178700,因为它应该也将工作。 有什么想法吗

    PS:再次感谢您到目前为止在Opencv参考资料中对Dan Mašek的帮助

    小贴士:

    ->对于一些后端,fourcc=-1会从系统中弹出“编解码器选择”对话框

    ->若要保存图像序列,请使用正确的文件名(例如img_u%02d.jpg)和fourcc=0或fps=0。使用未压缩的图像格式(例如img_%02d.BMP)保存原始帧

    ->大多数编解码器都是有损的。如果您想要无损视频文件,您需要使用无损编解码器(例如FFMPEG FFV1、Huffman HFYU、Lagarith LAGS等)

    ->如果启用了FFMPEG,则可以使用codec=0;fps=0;创建未压缩(原始)视频文件

    请在回答中添加C样本。
    FOURCC is 'DIB '
    
    //record the Videofile with VideoWriter to "myVideoColor.avi"
    capture = new Capture("myVieoColor.avi");
    System.Diagnostics.Debug.WriteLine(CvInvoke.cveVideoCaptureGet(capture, Emgu.CV.CvEnum.CapProp.FourCC));
    
    VideoWriter myVideoWriter = new VideoWriter ("myVieoColor.avi", 1397178700 , 15, videoSize, true);
    //works great with 1397178700 == LAGS codec
    
    VideoWriter myVideoWriter = new VideoWriter ("myVieoColor.avi", 0 , 15, videoSize, true);
    //dont work and CapProb.FourCC returns 808596553