【问题标题】:how can I play multiple videos simultaneously using opencv in python?如何在 python 中使用 opencv 同时播放多个视频?
【发布时间】:2017-12-21 09:56:18
【问题描述】:

大家好,我被困在这一点上。我想使用 opencv 在我的屏幕上播放四个视频。谁能帮我怎么做?假设我想同时播放

  1. first.avi
  2. second.avi
  3. 第三个.avi
  4. 第四个.avi

我指的是以下代码。它对单个 avi 文件播放得很好。 是否有必要连接或者我可以在四个不同的窗口中运行?欢迎任何建议 导入简历2 将 numpy 导入为 np

# Create a VideoCapture object and read from input file
# If the input is the camera, pass 0 instead of the video file name
cap = cv2.VideoCapture('first.avi')
cap2 =cv2.VideoCapture('second.avi')

if (cap.isOpened()== False): 
  print("Error opening video stream or file")
if (cap2.isOpened()== False): 
  print("Error opening video stream or file")

while(cap.isOpened()||cap2.isOpened()):
  # Capture frame-by-frame
  ret, frame = cap.read()
  ret, frame1 = cap2.read()
  if ret == True:

   # Display the resulting frame
    cv2.imshow('Frame',frame)
    cv2.imshow('Frame', frame1)


   # Press Q on keyboard to  exit
   if cv2.waitKey(25) & 0xFF == ord('q'):
  break
  else: 
    break


cap.release()
cap2.release()

cv2.destroyAllWindows()

【问题讨论】:

  • 全部阅读并显示?
  • 我知道,虽然从相机 cap = cv2.VideoCapture(0) cap1 =cv2.VideoCapure(1) 拍摄效果很好,但在播放文件中的视频时它不能正常工作
  • 我试图阅读所有但它在同一帧中重叠
  • @api55... 我认为 OP 所说的“重叠”是指来自多个视频的帧按照它们被捕获的顺序显示在一个窗口中。
  • @sgarizvi 这是我的猜测,这就是为什么我在 imshow 函数中建议使用不同的名称......只是我说的是相机而不是视频......

标签: python opencv


【解决方案1】:

为了播放多个视频,我们必须为每个视频使用唯一的窗口标题。这是一个演示如何实现的示例代码。

import numpy as np
import cv2

names = ['first.avi', 'second.avi', 'third.avi', 'fourth.avi'];
window_titles = ['first', 'second', 'third', 'fourth']


cap = [cv2.VideoCapture(i) for i in names]

frames = [None] * len(names);
gray = [None] * len(names);
ret = [None] * len(names);

while True:

    for i,c in enumerate(cap):
        if c is not None:
            ret[i], frames[i] = c.read();


    for i,f in enumerate(frames):
        if ret[i] is True:
            gray[i] = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY)
            cv2.imshow(window_titles[i], gray[i]);

    if cv2.waitKey(1) & 0xFF == ord('q'):
       break


for c in cap:
    if c is not None:
        c.release();

cv2.destroyAllWindows()

P.S: 这段代码只是一个快速而肮脏的例子,仅用于演示目的。在 Ubuntu 14.04 上使用 python 2 和 OpenCV 3.2 测试。

【讨论】:

  • 是否可以在同一个窗口中不间断地播放它们?
  • @Fadolphin。是的,可以通过为cv2.imshow 调用中的每个图像提供相同的窗口名称。另外,我的意见是在while循环之前分别调用cv2.namedWindowcv2.resizeWindow,预先创建窗口并将其调整为固定大小。
  • 谢谢先生。您为我的程序节省了大量资源。我使用moviepy将它们合并为一个视频,然后在一个窗口中播放。合并开始大约需要 60 秒。
【解决方案2】:

这是优化后的代码,对我有用

import cv2
import numpy as np 


cap1 = cv2.VideoCapture('1.mp4')
cap2 = cv2.VideoCapture('2.mp4')
while cap1.isOpened() or cap2.isOpened():

    okay1  , frame1 = cap1.read()
    okay2 , frame2 = cap2.read()

    if okay1:
        hsv1 = cv2.cvtColor(frame1 , cv2.COLOR_BGR2HSV)
        cv2.imshow('fake' , hsv1)

    if okay2:
        hsv2 = cv2.cvtColor(frame2 , cv2.COLOR_BGR2HSV)
        cv2.imshow('real' , hsv2)

    if not okay1 or not okay2:
        print('Cant read the video , Exit!')
        break

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    
    cv2.waitKey(1)

cap1.release()
cap2.release()
cv2.destroyAllWindows()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 2015-01-19
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多