Numpy到QImage崩溃

Numpy到QImage崩溃,numpy,pyqt5,qthread,qtgui,qimage,Numpy,Pyqt5,Qthread,Qtgui,Qimage,以下代码在单击按钮时或在从线程发出信号并在主gui中捕获时单击几下后崩溃 from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtGui import QPixmap, QImage from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QThread import numpy as np import time from PyQt5.QtWidgets import QApplication

以下代码在单击按钮时或在从线程发出信号并在主gui中捕获时单击几下后崩溃

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QPixmap, QImage
from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QThread
import numpy as np
import time
from PyQt5.QtWidgets import QApplication, QDialog, QPushButton, QVBoxLayout


def convert_np_qimage(cv_img , width, height):
    h, w, ch = cv_img.shape
    bytes_per_line = ch * w
    qim = QtGui.QImage(cv_img.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
    print(qim.size())
    return qim

class VideoThread(QThread):
    change_qimage_signal = pyqtSignal(QImage)
    
    def __init__(self):
        super().__init__()

    def run(self):
        print("run")
        width = 1280
        height = 1280
        
        cv_img = np.zeros([height,width,3],dtype=np.uint8)
        cv_img.fill(255)
        print("image shape: ", cv_img.shape)

        qimg = convert_np_qimage(cv_img, width, height)
        self.change_qimage_signal.emit(qimg)
        print("emitted")

        
    def stop(self):
        self.wait()

import sys

class Dialog(QDialog):

    def __init__(self):
        super(Dialog, self).__init__()
        Dialog.resize(self, 640, 480)
        
        button=QPushButton("Click")
        button.clicked.connect(self.startThread)
        
        mainLayout = QVBoxLayout()
        mainLayout.addWidget(button)
        
        
        self.setLayout(mainLayout)
        self.setWindowTitle("QImage Example")
        
    def startThread(self):
        self.thread = VideoThread()
        self.thread.change_qimage_signal.connect(self.getPixmap)
        self.thread.start()      
        
    def getPixmap(self, qimg):
        print("got qimage")
        qpixmap = QPixmap.fromImage(qimg)
        

if __name__ == '__main__':
    app = QApplication(sys.argv)
    dialog = Dialog()
    sys.exit(dialog.exec_())
如果高度和宽度设置为较小的数字(如3),程序不会崩溃。 如果我们在发出和更改信号之前将qimage转换为qpixmap,程序也不会崩溃 键入QPixmap。 该程序最初是为了使用opencv从网络摄像头获取图像而编写的。创建的numpy数组 由opencv崩溃太大的图像大小

使用的操作系统是Windows10,pyqt版本是5.12.3


你知道崩溃的原因是什么吗?

在使用PyQt5 5.15的Linux中,我不会重现这个问题,但这个错误很常见,因为传递“数据”不会复制信息,而是共享数据,所以在某个时候cv\u img和所有相关对象都会被销毁,包括“数据”因此,当通过信号传输数据并将其设置在QLabel中时,读取“数据”,但不再保留内存。这种情况下的解决方案是复制“数据”:

或者复制图像

return qim.copy()

如果在CMD中运行它,是否会收到错误消息?否,从命令提示符运行时,它不会显示任何错误消息,只是崩溃mmm,尝试更改为
return qim.copy()
Yes。那就是修复它。你能解释一下修理的原因吗。是因为它超出了范围吗?
return qim.copy()