为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

翻翻过去那场雪 2023-06-27 13:37:36
我一直在做一个项目,经过 6 个多小时的谷歌搜索和 openCV 书籍的挖掘后,我有点困惑。import cv2import numpy as npcap = cv2.VideoCapture('tree.avi')count = 0x_pos = 0y_pos = 0a_x = 180a_y = 180frames = 60if (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:         breakcap.release()cv2.destroyAllWindows()这是非常通用的代码,我将其作为灵感。我想要实现的是将正在播放的视频窗口移动到屏幕上的另一个位置。我从经验中知道,简单地在给定的窗口下添加另一个 moveWindow() 会导致窗口在应用于每一帧时在两者之间模糊。有没有一种方法可以使帧 1~100 位于 (100,100),帧 101~200 位于 (200, 200),依此类推?如果是实时的那就最好了,但是非常感谢有关让用户在播放视频时移动窗口的任何帮助。提前致谢。更新 我找到了一种方法来手动设置视频在某些帧内移动。然而,这似乎只适用于预设值。(ex) 帧 50 ~ 55 有没有办法实时使用一些外部输入?
查看完整描述

1 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

我想要实现的是将正在播放的视频窗口移动到屏幕上的另一个位置

如果上述陈述是您主要关心的问题,那么请使用FileVideoStream.

VideoCapture 管道将大部分时间花在读取和解码下一帧上。当读取、解码并返回下一帧时,OpenCV 应用程序被完全阻止。

这意味着当您移动视频时,应用程序会被阻止,因为管道无法解码下一帧。

例如:下面是显示框架,同时手动拖动窗口。

import cv2

import time

from imutils.video import FileVideoStream


vs = FileVideoStream('result.mp4').start()

time.sleep(0.2)


while True:

    frame = vs.read()


    cv2.imshow("out", frame)

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

        break


vs.stop()

cv2.destroyAllWindows()

现在,如果我们将代码与一些变量合并:


import cv2

import time

from imutils.video import FileVideoStream


vs = FileVideoStream('result.mp4').start()

time.sleep(0.2)


count = 0

x_pos = 0

y_pos = 0

a_x = 180

a_y = 180

frames = 60



while 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'):

        break


vs.stop()

cv2.destroyAllWindows()

您将看到两个窗口,一个正在显示,第二个窗口正在从窗口的右侧位置移动到左侧位置。

//img1.sycdn.imooc.com/649a75c80001b02401260126.jpg

查看完整回答
反对 回复 2023-06-27
  • 1 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信