C++ opencv 将网络摄像头输出写入 avi 文件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/24195926/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-28 00:40:09  来源:igfitidea点击:

opencv write webcam output to avi file

c++opencvwebcamvideo-capture

提问by noobie

I am trying to create an avi video from my webcam output using opencv. No exceptions are thrown, however the avi file it creates is 414 bytes in size and does not grow.

我正在尝试使用 opencv 从我的网络摄像头输出创建一个 avi 视频。不会抛出任何异常,但是它创建的 avi 文件大小为 414 字节并且不会增长。

Also it will not play with any media player. I suspect there is something wrong with the writing to file part.

它也不会与任何媒体播放器一起播放。我怀疑写入文件部分有问题。

Here is the code:

这是代码:

  CvCapture *capture = cvCaptureFromCAM( 0 );

  int width = ( int )cvGetCaptureProperty( capture, 
  CV_CAP_PROP_FRAME_WIDTH );

  int height = ( int )cvGetCaptureProperty( capture,
  CV_CAP_PROP_FRAME_HEIGHT );
  CvVideoWriter *writer = cvCreateVideoWriter("CamCapture.avi",                                                     
  -1,30, cvSize(  width, height ) );

  cvNamedWindow("capWindow", CV_WINDOW_AUTOSIZE);
  IplImage *frame = 0;

  // this returns 0 not sure why ??
  //double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
  double fps = 30;

  while( 1 )
  {
      frame = cvQueryFrame( capture );
      cvShowImage("capWindow",frame);
      cvWriteFrame( writer, frame );
      char c = cvWaitKey(1000/fps);

      if( c == 27 ) break;
  }

   cvReleaseCapture( &capture );
   cvReleaseVideoWriter( &writer );
   cvDestroyWindow( "capWindow" );

I have referenced and tried the following samples with no luck:

我参考并尝试了以下示例但没有运气:

回答by Haris

Dont use outdated C, use C++ api, it is easy to use and simple, for example the above code can be rewritten in C++ like,

不要使用过时的C,使用C++ api,使用起来很简单,例如上面的代码可以用C++重写,如,

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace std;
using namespace cv;

int main(){

    VideoCapture vcap(0); 
      if(!vcap.isOpened()){
             cout << "Error opening video stream or file" << endl;
             return -1;
      }

   int frame_width=   vcap.get(CV_CAP_PROP_FRAME_WIDTH);
   int frame_height=   vcap.get(CV_CAP_PROP_FRAME_HEIGHT);
   VideoWriter video("out.avi",CV_FOURCC('M','J','P','G'),10, Size(frame_width,frame_height),true);

   for(;;){

       Mat frame;
       vcap >> frame;
       video.write(frame);
       imshow( "Frame", frame );
       char c = (char)waitKey(33);
       if( c == 27 ) break;
    }
  return 0;
}

回答by user3639338

Use below code to write AVI format from capturing camera input.

使用以下代码从捕获相机输入写入 AVI 格式。

#include "opencv2/highgui/highgui.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char* argv[])
{
    VideoCapture cap(0); // open the video camera no. 0

    if (!cap.isOpened())  // if not success, exit program
    {
        cout << "ERROR: Cannot open the video file" << endl;
        return -1;
    }

 namedWindow("MyVideo",CV_WINDOW_AUTOSIZE); //create a window called "MyVideo"

   double dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH); //get the width of frames of the video
   double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //get the height of frames of the video

   cout << "Frame Size = " << dWidth << "x" << dHeight << endl;

   Size frameSize(static_cast<int>(dWidth), static_cast<int>(dHeight));

 VideoWriter oVideoWriter ("D:/MyVideo.avi", CV_FOURCC('P','I','M','1'), 20, frameSize, true); //initialize the VideoWriter object 

   if ( !oVideoWriter.isOpened() ) //if not initialize the VideoWriter successfully, exit the program
   {
        cout << "ERROR: Failed to write the video" << endl;
        return -1;
   }

    while (1)
    {

        Mat frame;

        bool bSuccess = cap.read(frame); // read a new frame from video

        if (!bSuccess) //if not success, break loop
       {
             cout << "ERROR: Cannot read a frame from video file" << endl;
             break;
        }

         oVideoWriter.write(frame); //writer the frame into the file

        imshow("MyVideo", frame); //show the frame in "MyVideo" window

        if (waitKey(10) == 27) //wait for 'esc' key press for 30ms. If 'esc' key is pressed, break loop
       {
            cout << "esc key is pressed by user" << endl;
            break; 
       }
    }

    return 0;

}