Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenCV:视频结束后如何重新启动?_Python_C++_C_Opencv - Fatal编程技术网

Python OpenCV:视频结束后如何重新启动?

Python OpenCV:视频结束后如何重新启动?,python,c++,c,opencv,Python,C++,C,Opencv,我正在播放一个视频文件,但播放结束后如何再次播放 Javier关闭当前捕获并再次打开: // play video in a loop while (1) { CvCapture *capture = cvCaptureFromAVI("video.avi"); if(!capture) { printf("!!! cvCaptureFromAVI failed (file not found?)\n"); return -1;

我正在播放一个视频文件,但播放结束后如何再次播放


Javier

关闭当前捕获并再次打开:

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

此代码不完整,尚未测试。它仅用于说明目的。

您不需要重新打开当前捕获。您需要做的就是将位置重置为文件的开头,并继续循环,而不是中断循环

if (!frame) 
{
    printf("!!! cvQueryFrame failed: no frame\n");
    cvSetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO , 0);
    continue;
}  
然而,有一个重大的延迟,好像你是重新打开它


请参见

如果要反复重新启动视频(也称为循环播放),可以在帧数达到
cap.get时使用If语句(cv2.cv.cv\u cap\u PROP\u frame\u count)
然后将帧数和
cap.set(cv2.cv.cv\u cap\u PROP\u POS\u FRAMES,num)
重置为相同的值。我将OpenCV 2.4.9与Python2.7.9一起使用,下面的示例为我不断循环视频

导入cv2
cap=cv2.VideoCapture('path/to/video')
帧计数器=0
虽然(正确):
#逐帧捕获
ret,frame=cap.read()
帧计数器+=1
#如果到达最后一帧,请重置捕获和帧计数器
如果frame\u counter==cap.get(cv2.cv.cv\u cap\u PROP\u frame\u COUNT):
frame_counter=0#或其他,只要它与下一行相同
封盖套件(cv2.cv.cv\u封盖\u道具\u位置\u框架,0)
#我们在框架上的行动就在这里
灰色=cv2.CVT颜色(边框,cv2.COLOR\u BGR2GRAY)
#显示结果帧
cv2.imshow(“帧”,灰色)
如果cv2.waitKey(1)&0xFF==ord('q'):
打破
#完成所有操作后,释放捕获
第1章释放()
cv2.destroyAllWindows()
它还可以重新捕获视频,而不是重置帧数:

如果frame\u counter==cap.get(cv2.cv.cv\u cap\u PROP\u frame\u COUNT):
帧计数器=0
cap=cv2.视频捕获(视频名称)

C?C++?JAVA还是怎样请改进标签。如果这个问题已经成功回答,请考虑点击它旁边的复选框来选择正式答案。如果没有,请考虑添加自己的答案。奇怪的是,在第一次重置之后,FEP会返回最后一帧。如果有人使用OpenCV 4.2.0版本,只需将
cv2.cv.cv\u CAP\u PROP\u FRAME\u COUNT
替换为
cv2.CAP\u PROP\u FRAME\u COUNT
cv2.cv.cv.cv\u CAP\u PROP\u POS\u FRAMES
替换为
cv2.CAP\u PROP\u POS\u FRAMES
。这对我很有用。如果您使用的是opencv python 4.2,
CAP\u PROP\u FRAME\u COUNT
没有前缀
CV