首页 > 解决方案 > 使用 open cv 同时打开两个视频?第二次开始有点晚

问题描述

当原始视频中的特定条件为真时,我需要触发视频播放

示例:我有一个使用开放 CV 播放的视频。在该视频期间,当某个条件为真时,我希望弹出另一个视频并开始播放。

鉴于第一个视频将继续播放而没有任何问题。

这不起作用,使用:

cap=cv2.VideoCapture(path)
while(cap.isOpen()):
    ret,frame=cap.read()
    if(condition):
        cap2=cv2.VideoCapture(path2)
        while(cap2.isOpen()):
            ret2,frame2=cap2.read()
            cv2.imshow("2nd video",frame2)
cv2.imshow('1st video',frame)

标签: pythonopencvasynchronousimage-processingvideo-capture

解决方案


您应该在循环之前初始化这两个VideoCapture类。while

import cv2

cap1 = cv2.VideoCapture("/Movies/B/ex1.mp4")
cap2 = cv2.VideoCapture("/Movies/B/ex2.mp4")

假设你condition是:

  • 在第一个视频的前 5 帧之后播放第二个视频。

  • 因此我初始化count变量

    • count = 0
      
  • 然后检查第一个视频是否打开,然后播放。

    • while cap1.isOpened():
           ret1, frm1 = cap1.read()
           if ret1:
                cv2.imshow("frm1", frm1)
                cv2.waitKey(1)
           else:
               break
           count += 1
      
      cv2.destroyAllWindows()
      
  • 现在我们将添加我们的condition. 在应用条件标准之前,我们将第二帧设置为None。如果条件已设置,则从cap2变量中获取输入

    • while cap1.isOpened():
          ret1, frm1 = cap1.read()
      
          if ret1:
              # condition
              if count > 5:
                  if cap2.isOpened():
                      _, frm2 = cap2.read()
      
              if frm2 is not None:
                  cv2.imshow("frm2", frm2)
                  cv2.waitKey(3)
      
              if frm1 is not None:
                  cv2.imshow("frm1", frm1)
                  cv2.waitKey(3)
      
           count += 1
      
      cv2.destroyAllWindows()
      

输出:


在此处输入图像描述

请注意,您不必使用cv2.waitKey(1). 我用它来检查我的代码是否正常工作。

代码


import cv2

cap1 = cv2.VideoCapture("b/b19.mp4")
cap2 = cv2.VideoCapture("b/b22.mp4")

count = 0

frm2 = None

while cap1.isOpened():
    ret1, frm1 = cap1.read()

    if ret1:
        # condition
        if count > 5:
            if cap2.isOpened():
                _, frm2 = cap2.read()

        if frm2 is not None:
            cv2.imshow("frm2", frm2)
            cv2.waitKey(3)

        if frm1 is not None:
            cv2.imshow("frm1", frm1)
            cv2.waitKey(3)

    count += 1

cv2.destroyAllWindows()

第二种选择


您还可以FileVideoStream使用 Queue 结构使用类来加速视频编码、解码和显示操作。结果,FileVideoStream同时处理所有操作。whereVideoCapture类在帧编码、解码或显示期间阻塞整个应用程序。

import cv2
from imutils.video import FileVideoStream

cap1 = FileVideoStream("b/b19.mp4").start()
cap2 = FileVideoStream("b/b22.mp4").start()

count = 0

frm2 = None

while cap1.more():
    frm1 = cap1.read()

    if count > 5:
        if cap2.more():
            frm2 = cap2.read()

    if frm2 is not None:
        cv2.imshow("frm2", frm2)
        cv2.waitKey(3)

    if frm1 is not None:
        cv2.imshow("frm1", frm1)
        cv2.waitKey(3)
    count += 1

cv2.destroyAllWindows()

推荐阅读