2012-03-28 30 views
5

Vấn đề là như sau Tôi muốn đọc một tập tin video từ đĩa và chuyển đổi nó mỗi khung thành màu xám và viết nó thành tập tin video mới Tôi đang sử dụng mã sau đây để làm như vậyOpenCV cvWriteFrame, cvWriteToAVI

CvCapture* capture = cvCreateFileCapture("/root/tree.avi"); 
if (!capture){ 
    return -1; 
} 
... 
CvVideoWriter* writer = 
cvCreateVideoWriter("/root/output.avi",CV_FOURCC('D','I','V','X'),fps,size); 
    ... 
    IplImage* gray_frame = cvCreateImage(
    size, 
    IPL_DEPTH_8U, 
    1 
); 

    while((bgr_frame=cvQueryFrame(capture)) != NULL) { 
    cvShowImage("Example2_10", bgr_frame); 

    cvCvtColor(bgr_frame,gray_frame,CV_RGB2GRAY); 

    cvShowImage("B&W result", gray_frame); 
    cvWriteFrame(writer, gray_frame); 
    char c = cvWaitKey(10); 
    if(c == 27) break; 
} 
... 

Vấn đề là, chương trình chạy tốt, nhưng không thể ghi khung hình thành output.avi và chỉ tạo tệp output.avi trống chỉ 5.5KB

Một điều nữa là tôi không thể chỉ viết gra_frame bằng cvWriteFrame và nếu tôi cố gắng viết bgr_frame, nó sẽ ghi tập tin output.avi thành công.

Xin vui lòng nếu có ai biết giải pháp, cho tôi biết

Trả lời

3

Bạn cần phải vượt qua is_color=0 đến cvCreateVideoWriter chức năng nếu bạn muốn ghi hình ảnh giá trị màu xám. Do đó bạn chỉ có thể ghi hình ảnh màu vào video đầu ra của mình.

Nó là tham số cuối cùng của cvCreateVideoWriter chức năng mà mặc định là 1:

CvVideoWriter* cvCreateVideoWriter(const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1) 
+0

Thật vậy. Lưu ý rằng chức năng này vẫn có thể bị thiếu trong Linux. tức là video sẽ ở chế độ màu bất kể tham số đó. Đó là một lỗi mà tôi gặp phải trong một thời gian trước đây, không chắc liệu nó đã được sửa chưa. – TaZ

+0

Tôi có thể xác nhận điều này hoạt động trong Linux, chỉ cần sử dụng nó ngay bây giờ. – RyanfaeScotland

0

Trong trường hợp của tôi vấn đề là tôi đã tạo ra một một CvVideoWriter ở độ phân giải khác so với hình ảnh tôi đã viết thư cho nó bằng cách sử cvWriteFrame . Điều này làm việc tốt trong một phiên bản trước của OpenCV, nhưng không viết khung trong OpenCV 2.4