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
C++ 在OpenCV中使用H.264压缩编写视频文件_C++_Opencv_Image Processing_Computer Vision_Video Processing - Fatal编程技术网

C++ 在OpenCV中使用H.264压缩编写视频文件

C++ 在OpenCV中使用H.264压缩编写视频文件,c++,opencv,image-processing,computer-vision,video-processing,C++,Opencv,Image Processing,Computer Vision,Video Processing,如何使用OpenCV中的VideoWriter类使用H.264压缩编写视频?我基本上想从网络摄像头中获取视频,并在按下角色后保存它。使用MPEG4第2部分压缩时,输出视频文件很大。您当然可以使用VideoWriter类,但您需要使用代表H264标准的类。FourCC代表四个字符的代码,它是媒体文件中使用的视频编解码器、压缩格式、颜色或像素格式的标识符 具体来说,当您创建一个VideoWriter对象时,在构造它时指定FourCC代码。有关更多详细信息,请参阅OpenCV文档: 我假设你使用C++

如何使用OpenCV中的VideoWriter类使用H.264压缩编写视频?我基本上想从网络摄像头中获取视频,并在按下角色后保存它。使用MPEG4第2部分压缩时,输出视频文件很大。

您当然可以使用
VideoWriter
类,但您需要使用代表H264标准的类。FourCC代表四个字符的代码,它是媒体文件中使用的视频编解码器、压缩格式、颜色或像素格式的标识符

具体来说,当您创建一个
VideoWriter
对象时,在构造它时指定FourCC代码。有关更多详细信息,请参阅OpenCV文档:

我假设你使用C++,所以<代码>视频监视器< /C>构造函数的定义是:

VideoWriter::VideoWriter(const String& filename, int fourcc, 
                         double fps, Size frameSize, bool isColor=true)
filename
是视频文件的输出,
fourcc
是您希望使用的代码的fourcc代码,
fps
是所需的帧速率,
frameSize
是视频的所需尺寸,
isColor
指定您是否希望视频为彩色。尽管FourCC使用四个字符,但OpenCV有一个实用程序可以解析FourCC并输出一个整数ID,该ID用作查找,以便能够将正确的视频格式写入文件。使用
CV_FOURCC
函数,并指定四个单个字符-每个字符对应于所需编解码器的FOURCC代码中的单个字符。请注意,
CV\u FOURCC
用于OpenCV 2.x。建议您对OpenCV 3.x及更高版本使用
cv::Videowriter::fourcc

具体来说,您可以这样称呼它:

int fourcc = CV_FOURCC('X', 'X', 'X', 'X');
int fourcc = VideoWriter::fourcc('X', 'X', 'X', 'X');
X
替换为属于FourCC的每个字符(按顺序)。因为您想要H264标准,所以可以创建一个
VideoWriter
对象,如下所示:

#include <iostream> // for standard I/O
#include <string>   // for strings

#include <opencv2/core/core.hpp>        // Basic OpenCV structures (cv::Mat)
#include <opencv2/highgui/highgui.hpp>  // Video write

using namespace std;
using namespace cv;

int main()
{
    VideoWriter outputVideo; // For writing the video

    int width = ...; // Declare width here
    int height = ...; // Declare height here
    Size S = Size(width, height); // Declare Size structure

    // Open up the video for writing
    const string filename = ...; // Declare name of file here

    // Declare FourCC code - OpenCV 2.x
    // int fourcc = CV_FOURCC('H','2','6','4');
    // Declare FourCC code - OpenCV 3.x and beyond
    int fourcc = VideoWriter::fourcc('H','2','6','4');

    // Declare FPS here
    double fps = ...;
    outputVideo.open(filename, fourcc, fps, S);

    // Put your processing code here
    // ...

    // Logic to write frames here... see below for more details
    // ...

    return 0;
}
如果使用上述方法,则无需调用
open
,因为这将自动打开writer以将帧写入文件


如果您不确定您的计算机是否支持H.264,请指定
-1
作为FourCC代码,当您运行显示计算机上所有可用视频编解码器的代码时,将弹出一个窗口。我想说的是,这只适用于Windows。当您指定
-1
时,Linux或Mac OS不会弹出此窗口。换言之:

VideoWriter outputVideo(filename, -1, fps, S);
如果您的计算机上不存在H.264,您可以选择最适合的。完成后,OpenCV将创建正确的FourCC代码以输入到
VideoWriter
构造函数中,这样您将获得一个VideoWriter实例,该实例表示一个
VideoWriter
,将该类型的视频写入文件

一旦您准备好了一个存储在
frm
中用于写入文件的框架,您可以执行以下任一操作:

outputVideo << frm; 

作为奖励,这里有一个关于如何在OpenCV中读/写视频的教程:-然而,它是为Python编写的,但值得一提的是,在链接的底部,有一个已知适用于每个操作系统的FourCC代码列表。顺便说一句,他们为H264标准指定的四个CC代码实际上是
'X','2','6','4'
,因此如果
'H','2','6','4'
不起作用,请用
X
替换
H


另一张小纸条。如果您使用的是Mac OS,那么您需要使用的是
'A','V','C','1'
'M','P','4','V'
。根据经验,
'H'、'2'、'6'、'4'
'X'、'2'、'6'、'4'
尝试指定FourCC代码时似乎不起作用。

对于H.264,大多数人使用AVC,因此

cv2.VideoWriter_fourcc('a','v','c','1'))

mp4v
似乎也适用于许多人。

我试过这个程序。首先,当我尝试将Fourcc参数用作-1时,没有弹出窗口。当我尝试使用您提到的x264时,我得到了“无法打开编解码器:libx264”错误和一些其他错误,如“检测到损坏的ffmpeg默认设置”。。顺便说一句,我使用ubuntu 14.04,这意味着你没有H264库。。。。这是另一篇文章。当我开始工作时,我会给你一个链接。顺便说一句-1只在Windows中工作。我也忘了提那件事。哎呀!非常感谢。当您进行h264 lib安装时,请务必通知我。我需要知道你是否这样做,还要注意
fps
现在是
double
@YunusTemurlenk。你可以使用
cv::imwrite
并指定不同的图像格式和不同的压缩选项。上述方法仅适用于视频,因此您绝对不应使用此方法。有关示例,请参见。
outputVideo << frm; 
outputVideo.write(frm);