使用opencv同时打开两个视频?第二次开始有点晚

Open two videos simultaneously using open cv? 2nd started abit later

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

示例: 我有一个使用开放式 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)

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

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 class 通过使用 Queue 结构来加速视频编码、解码和显示操作。结果,FileVideoStream 并发处理所有操作。其中 VideoCapture class 在帧编码、解码或显示期间阻塞 entire-application。

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()