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

标签 c++ opencv webcam video-capture

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

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

代码如下:

  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" );

我引用并尝试了以下示例,但没有成功:

最佳答案

不要用过时的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;
}

关于c++ - opencv 将网络摄像头输出写入 avi 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24195926/

相关文章:

java - 将从网络摄像头获取的图像添加到现有的 JPanel

silverlight - 为什么 Silverlight 在没有任何编码 API 的情况下提供网络摄像头和麦克风支持?

Silverlight 4 网络摄像头权限加载用户控件

python - 从图像中提取奶牛编号

c++ - 我可以从最终产品中删除 Boost.log V2 的所有效果吗?

c++ - 在 C++ 中比较两个 multimap 对象

c++ - 如何使用 gmock 框架设置通过引用发送的参数?

c++ - 计算两个数组之间余弦相似度的正确方法?

flash - 通过 ActionScript 关闭网络摄像头使用

c++ - boost::atomic 的 header 是什么