ビデオファイルを再生していますが、終了時に再度再生するにはどうすればよいですか?
ハビエル
ビデオを何度も再開したい場合 (別名ループ) は、フレーム カウントに達したときに 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)
現在のキャプチャを再度開く必要はありません。必要なのは、位置をファイルの先頭にリセットし、サイクルを中断するのではなく続行することだけです。
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を参照してください
現在のキャプチャを閉じて、もう一度開きます。
// 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);
}
このコードは完全ではなく、テストされていません。説明のみを目的としています。