2012-12-04 145 views
5

我认为我的问题是非常基本的,但我在OpenCV中编写此代码以简单地从网络摄像头捕获视频数据并将其保存到文件。现在的问题是文件是在所需的目的地进行的,最初大小约为286字节。然后,当我将第一帧分配给指针时,大小增加到414字节。但是,当我运行整个代码时,保存的视频的大小仍然是414字节。当然,因此我的媒体播放器无法播放该文件,并说“不是QuickTime播放器可以识别的格式”。而VLC播放器也是如此。OpenCV将视频保存到文件

这里是我的同一代码:

#include <opencv2/opencv.hpp> 
#include <opencv2/highgui/highgui.hpp> 

int main(int argc, char** argv) { 
CvCapture* capture; 

capture = cvCreateCameraCapture(0); 

assert(capture != NULL); 

IplImage* bgr_frame = cvQueryFrame(capture); 

CvSize size = cvSize(
        (int)cvGetCaptureProperty(capture, 
               CV_CAP_PROP_FRAME_WIDTH), 
        (int)cvGetCaptureProperty(capture, 
               CV_CAP_PROP_FRAME_HEIGHT) 
        ); 

cvNamedWindow("Webcam", CV_WINDOW_AUTOSIZE); 

CvVideoWriter *writer = cvCreateVideoWriter( "/Users/user/Desktop/OpenCV_trial/OpenCV_trial/vidtry.AVI", 
              CV_FOURCC('D','I','V','X'), 
              30, 
              size 
              ); 

while((bgr_frame = cvQueryFrame(capture)) != NULL) 
{ 
    cvWriteFrame(writer, bgr_frame); 
    cvShowImage("Webcam", bgr_frame); 
    char c = cvWaitKey(33); 
    if(c == 27) break; 
} 
cvReleaseVideoWriter(&writer); 
cvReleaseCapture(&capture); 
cvDestroyWindow("Webcam"); 
return(0); 
} 

我不知道为什么会这样。我正在使用mac OSX Lion并运行Xcode。

有没有人遇到过这个问题?如果是这样,我怎么解决它?

谢谢!

-Yash

+0

你有没有尝试打开文件与其他玩家VLC例如.. –

回答

1

你有没有尝试打开文件与其他球员? VLC例如..

这是因为Quicktime和.avi不相处得很好。

看看苹果documentation

否则请尝试更改视频编解码器,这是opencv reference

+0

是的,也会有相同的VLC此外,我认为有一些错误的代码的运行方式?因为该文件的大小不会增长 另外,我从博客中获取代码后,我的代码给出了相同的错误。 – yashc

+0

等待,我尝试测试您的代码! –

+0

我测试了您的代码并所有工作正常,视频.avi创建,我可以用mplayer打开它(我正在linux下工作,所以我可以测试QuickTime的)。 –

2

嗨,我想我找到了问题的答案。

正如Velthune所说,它似乎是一个编解码器问题,MAC OS只能运行其中的一小部分。这里是所有工作的链接: List of QuickTime codecs supported by the mac os port

并非所有的编解码器在那里工作,虽然。在我尝试过的所有那些WRLE中似乎都起作用了。

非常感谢Velthune。 -Yash

+0

谢谢你的链接实例! –

0

其实我也试图做同样的事情。但是,我在Windows 7中使用Visual C++(Express Edition)进行了尝试。但是在这种情况下,我们需要将额外的头文件添加为“#include”stdafx.h“并确保保存文件的链接存在。代码我修改为如下:

#include "stdafx.h" 
#include <opencv2/opencv.hpp> 
#include <opencv2/highgui/highgui.hpp> 

int main(int argc, char** argv) { 
CvCapture* capture; 

capture = cvCreateCameraCapture(0); 

assert(capture != NULL); 

IplImage* bgr_frame = cvQueryFrame(capture); 

CvSize size = cvSize(
        (int)cvGetCaptureProperty(capture, 
               CV_CAP_PROP_FRAME_WIDTH), 
        (int)cvGetCaptureProperty(capture, 
               CV_CAP_PROP_FRAME_HEIGHT) 
        ); 

cvNamedWindow("Webcam", CV_WINDOW_AUTOSIZE); 

CvVideoWriter *writer = cvCreateVideoWriter("D:/vidtry.AVI",CV_FOURCC('D','I','V','X'),15,size); 

while((bgr_frame = cvQueryFrame(capture)) != NULL) 
{ 
    cvWriteFrame(writer, bgr_frame); 
    cvShowImage("Webcam", bgr_frame); 
    char c = cvWaitKey(33); 
    if(c == 27) break; 
} 
cvReleaseVideoWriter(&writer); 
cvReleaseCapture(&capture); 
cvDestroyWindow("Webcam"); 
return(0); 
}