2012-12-04 57 views
5

Tôi nghĩ câu hỏi của mình khá cơ bản, nhưng tôi đang viết mã này trong OpenCV để chỉ cần thu thập dữ liệu video từ webcam và lưu nó vào tệp. Bây giờ vấn đề là các tập tin được thực hiện tại đích mong muốn, ban đầu nó là khoảng 286 byte trong kích thước. Sau đó, khi tôi gán khung đầu tiên cho con trỏ, kích thước sẽ tăng lên 414 byte. Tuy nhiên, khi tôi chạy toàn bộ mã, kích thước của video đã lưu vẫn còn 414 byte. Tất nhiên, kết quả là trình phát phương tiện của tôi không thể phát tệp và nói "không ở định dạng mà QuickTime Player hiểu". và điều tương tự cũng xảy ra với trình phát VLC.OpenCV lưu video vào tập tin

Đây là mã của tôi cho cùng:

#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); 
} 

Tôi không biết tại sao điều này đang xảy ra. Tôi đang sử dụng mac OSX Lion và chạy Xcode.

Có ai từng gặp vấn đề này trước đây không? Nếu vậy, làm thế nào tôi có thể giải quyết nó?

Cảm ơn bạn!

-Yash

+0

có bạn cố gắng để mở tập tin của bạn với người chơi khác VLC ví dụ .. –

Trả lời

1

Bạn đã cố gắng để mở tập tin của bạn với người chơi khác? VLC chẳng hạn ..

Điều này vì Quicktime và .avi không hòa hợp với nhau.

Hãy nhìn vào quả táo documentation.

Nếu không, hãy thử thay đổi codec video, đây là opencv reference.

+0

Vâng, cùng xảy ra với VLC Bên cạnh đó, tôi nghĩ rằng có điều gì đó sai trong cách mã chạy?. Ngoài ra, tôi đã lấy mã từ một blog, sau khi mã của riêng tôi đã đưa ra cùng một lỗi. – yashc

+0

chờ, tôi thử kiểm tra mã của bạn! –

+0

Tôi đã kiểm tra mã của bạn và tất cả các công trình tốt, video .avi được tạo ra và tôi có thể mở nó với mplayer (Tôi đang làm việc dưới Linux để tôi có thể kiểm tra thời gian nhanh chóng). –

2

Xin chào, tôi nghĩ rằng tôi đã tìm thấy câu trả lời cho câu hỏi.

Như Velthune đã đề xuất, nó có vẻ là một vấn đề codec và hệ điều hành MAC chỉ có thể chạy một vài trong số chúng. Đây là liên kết cho tất cả những người hoạt động: List of QuickTime codecs supported by the mac os port

Không phải tất cả các codec được liệt kê ở đó đều hoạt động. Trong số tất cả những cái mà tôi đã thử chỉ WRLE dường như làm việc.

Cảm ơn rất nhiều Velthune. -Yash

+0

Cảm ơn bạn về trường hợp liên kết! –

0

Thực ra tôi cũng đang cố gắng làm tương tự. Nhưng nó của tôi mà tôi đã cố gắng trong Visual C++ (Express Edition) trong windows 7. Nhưng trong trường hợp này chúng ta cần phải thêm tiêu đề thêm là "#include" stdafx.h "và cũng đảm bảo liên kết để lưu các tập tin tồn tại. i mã hiệu chỉnh là như:

#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); 
}