Mag*_*ick 5 python numpy pyqt python-3.x pyqt5
考虑以下代码
from PyQt5.QtWidgets import QMainWindow, QLabel, QSizePolicy, QApplication
from PyQt5.QtGui import QPixmap, QImage
from PyQt5.QtCore import Qt
import numpy as np
import sys
class Test(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(10,10,640, 400)
pixmap_label = QLabel()
pixmap_label.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
pixmap_label.resize(640,400)
pixmap_label.setAlignment(Qt.AlignCenter)
im_np = np.ones((1800,2880,3),dtype=uint8)
im_np = np.transpose(im_np, (1,0,2))
qimage = QImage(im_np, im_np.shape[1], im_np.shape[0],
QImage.Format_RGB888)
pixmap = QPixmap(qimage)
pixmap = pixmap.scaled(640,400, Qt.KeepAspectRatio)
pixmap_label.setPixmap(pixmap)
self.setCentralWidget(pixmap_label)
self.show()
def main():
app = QApplication(sys.argv)
win = Test()
sys.exit(app.exec_())
if __name__=="__main__":
main()
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
TypeError:arguments与任何重载调用都不匹配:QImage():参数太多QImage(QSize,QImage.Format):参数1有意外类型'numpy.ndarray'QImage(int,int,QImage.Format):参数1有意外类型'numpy.ndarray'QImage(bytes,int,int,QImage.Format):参数1有意外类型'numpy.ndarray'QImage
(sip.voidptr,int,int,QImage.Format):参数1有意外类型'numpy.ndarray'QImage(bytes,int,int,int,QImage.Format):参数1有意外类型'numpy.ndarray'QImage
(sip.voidptr,int,int,int,QImage.Format):参数1有意外类型'numpy.ndarray'QImage(List [str]):参数1有意外类型'numpy.ndarray'QImage(str,format:str = None):参数1有意外类型'numpy.ndarray'QImage(QImage) :参数1具有意外类型'numpy.ndarray'QImage(Any):参数太多
根据这篇文章,这可能是由numpy创建一个视图引起的.修改线条
im_np = np.array(img)
im_np = np.transpose(im_np, (1,0,2))
Run Code Online (Sandbox Code Playgroud)
至
im_np = np.array(img)
im_np = np.transpose(im_np, (1,0,2))
im_np_cpy = np.copy(im_np)
Run Code Online (Sandbox Code Playgroud)
产生相同的错误.为了测试我没有传递视图,我打印测试结果
im_np_cpy.base is im_np
Run Code Online (Sandbox Code Playgroud)
这是假的.使用cv2正确显示图像.我显然缺少一些东西,任何想法是什么?
干杯!
小智 8
Ivan 的答案简短而优雅,但是 numpy 使用 (H, W) 顺序,而 Qt 使用 (W, H) 顺序。因此,为了使其工作,我必须交换第二行中的 w 和 h :
h, w, _ = img.shape
qimage = QImage(img.data, w, h, 3 * w, QImage.Format_RGB888)
Run Code Online (Sandbox Code Playgroud)
(我更愿意对上述答案发表评论,但我没有足够的声誉。)
我在转置后添加了一个副本,如下所示:
im_np = np.transpose(im_np,(1,0,2)).copy()
Run Code Online (Sandbox Code Playgroud)
这对我有用.
小智 5
检查模块 qimage2ndarray 是否适合您的需求,只需一行代码 https://pypi.org/project/qimage2ndarray/
yourQImage=qimage2ndarray.array2qimage(yournumpyarray)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7629 次 |
| 最近记录: |