2014-09-18 5 views
-1

내가 OpenCV의를 사용하여 내 노트북 ​​카메라로 비디오를 작성하려고 해요를 작성하지만 다음과 같은 오류 얻을 때 :OpenCV의 문제 카메라 비디오

VIDEOIO ERROR: V4L/V4L2: VIDIOC_S_CROP 
VIDEOIO ERROR: V4L2: getting property #5 is not supported 
OpenCV Error: Unsupported format or combination of formats (Gstreamer Opencv backend does not support this file type.) in CvVideoWriter_GStreamer::open, file /home/tul1/Downloads/opencv-3.0.0-alpha/modules/videoio/src/cap_gstreamer.cpp, line 1265 
terminate called after throwing an instance of 'cv::Exception' 
    what(): /home/tul1/Downloads/opencv-3.0.0-alpha/modules/videoio/src/cap_gstreamer.cpp:1265: error: (-210) Gstreamer Opencv backend does not support this file type. in function CvVideoWriter_GStreamer::open 

내가 사용하는 코드는 다음과 같습니다

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

int main(int argc, char** argv) 
{ 
    cvNamedWindow("DisplayCamera", CV_WINDOW_AUTOSIZE); 
    CvCapture* capture = cvCreateCameraCapture(0); 
    IplImage* frame; 

    const char filename[] = "video"; 

// int fourcc = CV_FOURCC('X','V','I','D'); 
// int fourcc = CV_FOURCC('P','I','M','1'); 
    int fourcc = CV_FOURCC('M','J','P','G'); 
// int fourcc = CV_FOURCC('M', 'P', '4', '2'); 
// int fourcc = CV_FOURCC('D', 'I', 'V', '3'); 
// int fourcc = CV_FOURCC('D', 'I', 'V', 'X'); 
// int fourcc = CV_FOURCC('U', '2', '6', '3'); 
// int fourcc = CV_FOURCC('I', '2', '6', '3'); 
// int fourcc = CV_FOURCC('F', 'L', 'V', '1'); 
// fourcc = -1; 
// int fourcc = 0; 

// printf("%d\n", fourcc); 

    double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); 
    int width = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH); 
    int height = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT); 
    CvSize size = cvSize(width , height); 
    int isColor = 1; 
    CvVideoWriter* writer = cvCreateVideoWriter(filename, fourcc, fps, size, isColor); 

    while(1) 
    { 
     frame = cvQueryFrame(capture); 
     if(!frame) 
     { 
      fprintf(stderr,"Frame error"); 
      break; 
     } 

     cvWriteFrame(writer , frame); 
     cvShowImage("DisplayCamera", frame); 

     char c = cvWaitKey(30); 
     if(c == 27) break;  
    } 

    cvReleaseVideoWriter(&writer); 
    cvReleaseImage(&frame); 
    cvReleaseCapture(&capture); 
    cvDestroyWindow("DisplayCamera"); 
    return 0; 
} 

CV_FOURCC로 모든 코덱을 테스트했지만 여전히 오류가 표시됩니다.

내가 뭘 잘못하고 있니? 코덱 문제가 있습니까?

+0

코덱 문제처럼 보입니다 ...... –

+0

어떻게 해결되는지 알고 계십니까? 나는 debian jessie를 사용하고 있습니다. – tul1

+0

코덱은 gstreamer 백엔드에서 지원되지 않습니다. opencv의 사용되지 않는 c-api를 사용하지 마십시오. * 사용하지 마십시오. – berak

답변

0

filename에는 확장자가없는 것일 수도 있습니다. 에 코드를 업데이트 :

const char filename[] = "video.avi"; 

또 다른 잠재적 인 문제는 카메라에 의해 반환 된 fps입니다. 으로 인해 문제가 발생할 수 있습니다.

+0

동일합니다. 같은 오류가 나타납니다. – tul1

+0

Ok .. 그러면 카메라가 반환하는 fps는 0입니다. 임의의 값을 직접 설정해야합니다. – karlphillip

0

이 코드를 사용해보십시오.

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

    double fps = vcap.get(CV_CAP_PROP_FPS); 
    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'),fps, 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; 
}