如何使用 openCV python 播放时移动视频窗口

我一直在做一个项目,经过 6 个多小时的谷歌搜索和 openCV 书籍的挖掘后,我有点困惑。


import cv2

import numpy as np


cap = cv2.VideoCapture('tree.avi')

count = 0

x_pos = 0

y_pos = 0

a_x = 180

a_y = 180

frames = 60


if (cap.isOpened()== False): 

   print("Error opening video stream or file")


while(cap.isOpened()):

  ret, frame = cap.read()


  if ret == True:

    resized = frame

    scale_percent = 200

    width = int(frame.shape[1] * scale_percent / 100)

    height = int(frame.shape[0] * scale_percent / 100)

    dim = (width, height)


    if count < 50 or count >= 55:

      cv2.moveWindow('Frame', x_pos, y_pos)

      cv2.imshow('Frame', frame)


    if count in range(50, 55):

      resized = cv2.resize(frame, dim, interpolation = cv2.INTER_AREA)

      cv2.imshow('Frame',resized)

      x_pos = x_pos + int((a_x / frames) * (count - 50))

      y_pos = y_pos + int((a_y / frames) * (count - 50))


      cv2.moveWindow('Frame', x_pos, y_pos)


      count = count + 1


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

        break


      else: 

        break


cap.release()


cv2.destroyAllWindows()

这是非常通用的代码,我将其作为灵感。我想要实现的是将正在播放的视频窗口移动到屏幕上的另一个位置。我从经验中知道,简单地在给定的窗口下添加另一个 moveWindow() 会导致窗口在应用于每一帧时在两者之间模糊。


有没有一种方法可以使帧 1~100 位于 (100,100),帧 101~200 位于 (200, 200),依此类推?如果是实时的那就最好了,但是非常感谢有关让用户在播放视频时移动窗口的任何帮助。


提前致谢。


更新 我找到了一种方法来手动设置视频在某些帧内移动。然而,这似乎只适用于预设值。(ex) 帧 50 ~ 55 有没有办法实时使用一些外部输入?


翻翻过去那场雪
浏览 149回答 1
1回答

胡说叔叔

我想要实现的是将正在播放的视频窗口移动到屏幕上的另一个位置如果上述陈述是您主要关心的问题,那么请使用FileVideoStream.VideoCapture 管道将大部分时间花在读取和解码下一帧上。当读取、解码并返回下一帧时,OpenCV 应用程序被完全阻止。这意味着当您移动视频时,应用程序会被阻止,因为管道无法解码下一帧。例如:下面是显示框架,同时手动拖动窗口。import cv2import timefrom imutils.video import FileVideoStreamvs = FileVideoStream('result.mp4').start()time.sleep(0.2)while True:    frame = vs.read()    cv2.imshow("out", frame)    if cv2.waitKey(25) & 0xFF == ord('q'):        breakvs.stop()cv2.destroyAllWindows()现在,如果我们将代码与一些变量合并:import cv2import timefrom imutils.video import FileVideoStreamvs = FileVideoStream('result.mp4').start()time.sleep(0.2)count = 0x_pos = 0y_pos = 0a_x = 180a_y = 180frames = 60while True:    frame = vs.read()    scale_percent = 200    width = int(frame.shape[1] * scale_percent / 100)    height = int(frame.shape[0] * scale_percent / 100)    dim = (width, height)    if count in range(0, 55):        resized = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)        cv2.imshow('Frame', resized)        x_pos = x_pos + int((a_x / frames) * (count - 50))        y_pos = y_pos + int((a_y / frames) * (count - 50))        cv2.moveWindow('Frame', x_pos, y_pos)    cv2.imshow("out", frame)    if cv2.waitKey(25) & 0xFF == ord('q'):        breakvs.stop()cv2.destroyAllWindows()您将看到两个窗口,一个正在显示,第二个窗口正在从窗口的右侧位置移动到左侧位置。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python