2012-12-04 148 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); 
}