python - 使用 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)
解决方案
您应该在循环之前初始化这两个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()
推荐阅读
- javascript - 通过javascript在点击时触发CSS动画
- ssl - Curl 未发送客户端证书
- python - 从模板中的 django-form 获取 html 文本输入元素
- python - 将 BQ 查询结果下载到 Python 数据框时出现 504 Deadline Exceeded 错误
- node.js - 错误:在 BoundPool.end 上多次调用池结束
- windows - 无法为非管理员用户的 PATH 找到 Windows 终端的 wt.exe
- mysql - 为什么我的 SQL 查询不适用于 JDBC Java
- sql - HIVE_PARTITION_SCHEMA_MISMATCH - 不同列之间
- python - Python Dataframe fillna,左列有值
- python - 子类化、继承和子类选择