4

ビデオファイルを再生していますが、終了時に再度再生するにはどうすればよいですか?

ハビエル

4

4 に答える 4

9

ビデオを何度も再開したい場合 (別名ループ) は、フレーム カウントに達したときに if ステートメントを使用してから、フレーム カウントを同じ値にcap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT)リセットすることで実行できます。cap.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, num)私はPython 2.7.9でOpenCV 2.4.9を使用していますが、以下の例ではビデオをループし続けています。

import cv2

cap = cv2.VideoCapture('path/to/video') 
frame_counter = 0
while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()
    frame_counter += 1
    #If the last frame is reached, reset the capture and the frame_counter
    if frame_counter == cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT):
        frame_counter = 0 #Or whatever as long as it is the same as next line
        cap.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, 0)
    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

フレーム カウントをリセットする代わりに、ビデオを再キャプチャすることもできます。

if frame_counter == cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT):
    frame_counter = 0
    cap = cv2.VideoCapture(video_name)
于 2015-01-11T18:24:23.967 に答える
2

現在のキャプチャを再度開く必要はありません。必要なのは、位置をファイルの先頭にリセットし、サイクルを中断するのではなく続行することだけです。

if (!frame) 
{
    printf("!!! cvQueryFrame failed: no frame\n");
    cvSetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO , 0);
    continue;
}  

それにもかかわらず、あなたがそれを再開したかのように大幅な遅れがあります...

http://docs.opencv.org/2.4.6/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=cvqueryframe#videocapture-setを参照してください

于 2013-09-25T15:55:02.393 に答える
0

現在のキャプチャを閉じて、もう一度開きます。

// play video in a loop
while (1)
{
    CvCapture *capture = cvCaptureFromAVI("video.avi");
    if(!capture) 
    {
        printf("!!! cvCaptureFromAVI failed (file not found?)\n");
        return -1; 
    }

    IplImage* frame = NULL;
    char key = 0;   
    while (key != 'q') 
    {
        frame = cvQueryFrame(capture);       
        if (!frame) 
        {
            printf("!!! cvQueryFrame failed: no frame\n");
            break;
        }     

        cvShowImage("window", frame);

        key = cvWaitKey(10);  
    }

    cvReleaseImage(&frame);
    cvReleaseCapture(&capture);
}

このコードは完全ではなく、テストされていません。説明のみを目的としています。

于 2012-04-07T18:47:54.530 に答える