我正在用頭撞墻試圖弄清楚如何調整和重新排列我在 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 文件的嘗試,經過更多調整后,該程序按預期運行。
添加回答
舉報
0/150
提交
取消