0

我正在尝试使用 qtimer 通过 jsonrpc 获取新图像并将其显示在窗口中。

它可以工作,尽管图像具有蓝色色调,并且程序在获取两个图像后退出

我的代码如下所示:

import sys
from PySide6.QtCore import QTimer
from PySide6.QtGui import QPixmap, QImage
from PySide6.QtWidgets import QMainWindow, QApplication, QLabel
import requests
import numpy as np
from PIL import Image
import time

class MainWindow(QMainWindow):

    

    def __init__(self):
        super(MainWindow, self).__init__()
        self.n = 1
        self.title = "Image Viewer"
        self.setWindowTitle(self.title)

        self.label = QLabel(self)
        self.url = 'http://192.168.2.226:4000/jsonrpc'
        self.payload = {"jsonrpc":"2.0","method":"get_frame", "params": [5],"id":1 }
        self.timer = QTimer()
        self.timer.setInterval(1000)
        self.timer.timeout.connect(self.update_frame)
        self.timer.start()
        
        print('initialization')
    
    def update_frame(self):
        print(f'Function ran {self.n} times')
        self.n= self.n+1
        data = requests.get(url= self.url, json=self.payload).json()
        data = np.array(data['result']).reshape(480,640,3).astype(np.int32)
        data = QImage(data.tobytes(), data.shape[0],data.shape[1],QImage.Format_RGB32)
        data = QPixmap(data)
        self.label.setPixmap(data)
        self.setCentralWidget(self.label)
        self.resize(data.width(), data.height())




app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())

这个的输出是:

initialization
Function ran 1 times
Function ran 2 times

我希望它继续运行,尽管它在两次迭代后始终存在(我尝试更改时间)并且没有错误消息。

我遇到的另一件事是 QT 应用程序以蓝色色调显示图像,而使用 PIL 保存数据给了我预期的图像,并且通过 opencvs bgr2rgb 运行图像没有任何改变。

编辑:返回 numpy 数组的远程函数如下所示:

@dispatcher.add_method
def get_frame(device=None):
    if device is None:
        cap = cv2.VideoCapture()
        cap.open(0,apiPreference=cv2.CAP_V4L2)
    else:
        cap = cv2.VideoCapture()
        cap.open(device, apiPreference=cv2.CAP_V4L2)
    
    ret, frame = cap.read()
    cap.release()
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    if ret:
        return frame.tolist()
    
    else:
        return "Device did not return any frame"
4

0 回答 0