使用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()
当我的原始视频中的特定条件为真时,我需要触发视频播放
示例: 我有一个使用开放式 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()