2010-06-04 1 views
18

저는 C++에서 OpenCV를 사용하여 탐색 및 되감기 기능 (비디오 (.avi) 용)을 찾거나 구현하려고했지만 그 방법을 찾지 못했습니다. 전체 파일을 한 번 저장하고 각 이미지를 저장합니다. 다른 방법이 있습니까?OpenCV 탐색 기능/되감기

모든 도움을 주시면 감사하겠습니다. 미리 감사드립니다!

+1

끝으로, OpenCV 검색은 flv에서 제대로 작동하지 않습니다. 검색을 시도하면 문제가 해결되지 않을 수 있습니다. 나에게 그것을 이해하는 하루가 걸렸다! !! –

답변

37

cvSetCaptureProperty()를 사용하면 밀리 초 단위 또는 서수 프레임 단위로 프레임을 순환 할 수 있습니다.

int cvSetCaptureProperty(CvCapture* capture, int property_id, double value); 

PROPERTY_ID 당신이 사용해야합니다 속성입니다. 프레임에 위치

  • CV_CAP_PROP_POS_AVI_RATIO - - 상대 단위 (0 위치 -의 시작 파일에서 밀리 초 단위로 위치가
  • CV_CAP_PROP_POS_FRAMES 시작 -

    1. CV_CAP_PROP_POS_MSEC가 : 그것은 다음 중 하나 일 수 있습니다 파일, 1 - 파일 끝)
    2. CV_CAP_PROP_FRAME_WIDTH - 비디오 스트림의 프레임 너비
    3. CV_CAP_PROP_FRAME_HEIGHT - hei (카메라 전용)
    4. CV_CAP_PROP_FPS - 프레임 속도 (카메라에만 해당)
    5. CV_CAP_PROP_FOURCC - 코덱의 4 문자 코드 (카메라에만 해당).

    처음 두 가지는 관심의 대상입니다.

    편집 : 추가 정보를 원하시면 :

    할 수 있습니다 반복 해 다양한 프레임 인덱스로 언급 한 함수를 호출하여 프레임을 순환.

    cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, frameIndex); 
    

    예 :

    IplImage* frame; 
    CvCapture* capture = cvCreateFileCapture("test.avi"); 
    
    /* iterate through first 10 frames */ 
    for (int i = 0; i < 10; i++) 
    { 
        /* set pointer to frame index i */ 
        cvSetCaptureProperty(capture, CV_CAP_POS_FRAMES, i); 
    
        /* capture the frame and do sth with it */ 
        frame = cvQueryFrame(capture); 
    } 
    

    할 때마다 사용자가/전달 비디오를 되감기 버튼을 클릭 실행하는 유사한 코드를 넣을 수 있습니다.

    C++ 방법 (OpenCV 2 이상)은 동일한 property_id 및 value 대신이 메서드를 사용하는 것입니다.

    bool VideoCapture::set(int property_id, double value) 
    
  • +0

    예제가 있습니까? .avi 파일이 있다고하면 프레임을 순환하는 데 어떻게 사용합니까? – Cenoc

    +0

    그런데 포인터를 보내 주셔서 감사합니다. – Cenoc

    +0

    내 대답을 편집했습니다. – Adi

    0

    highgui 라이브러리에는 검색 바 (cvCreateTrackbar 및 friends)에 대한 기능이 있습니다.

    +0

    그것이 묘사되는 방식으로는 검색 바처럼 들리지 않습니다. 일반 트랙 바가 들리는 것 같습니다. 또한 내가 온라인에서 찾은 모든 예는 그림 색조 변경과 같은 다른 무작위로 사용했습니다. – Cenoc

    +0

    파일 위치를 포함하여 원하는 모든 변수/이벤트에 트랙 바를 연결할 수 있습니다. 당신은 내장 된 탐색 바보다 작은 일을해야하지만 거기 있습니다. –

    1

    전체 파일을 IplImages 배열로 읽은 다음이를 통해 작업해야한다고 생각합니다. 이유는 cvQueryFrame은 단방향 프로세스이므로 한 번에 하나의 프레임을 순서대로 읽습니다. 나는 다른 어떤 생각도 할 수 없다. 비디오의 길이에 따라 초기화 시간이 그리 좋지 않을 수도 있습니다.

    cvTrackbars는 주로 매개 변수를 변경하는 데 사용됩니다. 변수 (포인터 형식의 매개 변수로 제공)의 값을 변경하고 콜백 함수를 throw합니다. 불행히도 HighGUI의 유일한 버튼 스타일 요소입니다.

    +0

    와우, 고마워요. 추측은 저를 위해 그것을 좁 힙니다. 나는 그것이 사실일지도 모른다라고 생각했다. 나는 게으르지 않고 멈추어야한다고 생각합니다. – Cenoc