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

在 PyQt 中动态调整视频大小

在 PyQt 中动态调整视频大小

不负相思意 2023-04-25 16:42:38
我正在用头撞墙试图弄清楚如何调整和重新排列我在 Raspberry Pi 上构建的相机应用程序。我希望能够通过点击视频来调整窗口大小,从全屏应用程序到将显示在触摸屏一角的较小版本。https://github.com/eighty2fifty1/multicam我正在使用 OpenCV 来运行相机本身。虽然该应用程序的目的是运行 4 个摄像头并在它们之间切换,但这一切都发生在外部硬件中,因此只需将其视为显示一个 USB 网络摄像头即可。我还没有完全准备好为此使用 OpenCV,但到目前为止它已经奏效了。当我尝试调整窗口大小、最小化或最大化窗口时,我的 RPi 4 似乎也出现分段错误。不确定这是否相关,但我已经尝试使用两张全新的 SD 卡来排除硬件问题。我试过的:以编程方式重新排列窗口。不会显示视频,还会给我一个分段错误。将 MyWindowClass 子类化为 BigWindowClass 和 SmallWindowClass,然后将单独的 .ui 文件发送到它们各自的类,然后使用 .show() 和 .hide() 方法来确定我想显示哪一个。这将在大窗口中显示视频,而不是小窗口。为了清楚起见,我省略了一些函数,但完整的源代码在上面的 github 链接中。class Thread(QThread):    global file, big, small    changePixmap = pyqtSignal(QImage)    def run(self):        cap = cv2.VideoCapture(0)        while running:            ret, frame = cap.read()            if ret:                # not sure if the queue was necessary to prevent memory or processor problems                if q.qsize() < 10:                    q.put(frame)                else:                    print(q.qsize())                if not q.empty():                    f = q.get()                    rgbImage = cv2.cvtColor(f, cv2.COLOR_BGR2RGB)                    h, w, ch = rgbImage.shape                    bytesPerLine = ch * w                    convertToQtFormat = QImage(rgbImage.data, w, h, bytesPerLine, QImage.Format_RGB888)                    if file == big:                        p = convertToQtFormat.scaled(640, 480, Qt.KeepAspectRatio)                    elif file == small:                        p = convertToQtFormat.scaled(200, 150, Qt.KeepAspectRatio)                    else:                        pass                    self.changePixmap.emit(p)        if self.isFinished():            print("thread killed")class MyWindowClass(QMainWindow, form_class):    def __init__(self, parent=None):        QMainWindow.__init__(self, parent)        self.setupUi(self)        self.sel = Selector()        self.press = 0        self.rel = 0
查看完整描述

1 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

所以我自己找到了解决方案。它可能不是最优雅或最有效的,但它正在工作。当来自 OpenCV 的图片太大以至于我需要先复制我的 QImage时,我从 Qt 崩溃中得到了一个重要线索。

convertToQtFormat = QImage(rgbImage.data, w, h, bytesPerLine, QImage.Format_RGB888)

i = convertToQtFormat.copy()

self.changePixmap.emit(i)

我重新审视了对主窗口进行子类化并使用 2 个单独的 .ui 文件的尝试,经过更多调整后,该程序按预期运行。

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

添加回答

举报

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