2012-04-07 91 views
0

我正在播放视频文件,但播放完毕后如何播放?OpenCV:如何在视频完成后重新启动视频?

哈维尔

+1

C 2 C++? Java的?或者是什么?请改善标签。 – karlphillip 2012-04-07 18:48:33

+1

如果此问题已成功解答,请考虑选择正式答案,方法是单击它旁边的复选框。如果不是,请考虑添加自己的答案。 – karlphillip 2012-06-05 23:30:41

回答

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

此代码是不完整的,没有经过测试。它仅用于说明目的。

1

您不需要重新打开当前捕获。您只需将位置重置到文件的开头,然后继续循环而不是将其打破。

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

+0

奇怪的是,在像这样第一次重置之后,Feed不断返回最后一帧。 – noio 2014-03-05 12:31:10

1

如果你想一遍又一遍重启视频(又名循环的话) ,可以通过在帧计数达到cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT)时使用if语句,然后将帧计数和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) 
相关问题