0

qtimer を使用して、jsonrpc 経由で新しい画像を取得し、ウィンドウに表示しようとしています。

画像には青い色合いがあり、プログラムは2つの画像を取得した後に終了しますが、機能します

私のコードは次のようになります。

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

2回繰り返した後(時間を変更してみました)、エラーメッセージなしで一貫して存在しますが、実行し続けることを期待しています。

私が苦労しているもう1つのことは、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