私は単純なGUIを構築して、マルチプロセッシングを学びたいと考えています。私のGUIでは、キャプチャボタンはフレームをキャプチャし、フレームまたは宣言されたスペース(Qlabel)内のGUI内に配置します。私はSOの他の投稿を読んだが、静かに私のプログラムでそれを使用する方法を理解していませんでした。エラーがGUIの外に使用することは安全ではないと述べたマルチプロセッシング:GUIスレッドの外側のピックスマップを使用することは安全ではありません
は、私は私のQPixmapのは、メインスレッドで実行されていることを示し
print(multiprocessing.current_process())
を試してみました。これは私のプログラム
import examplegui
from PySide.QtGui import *
from PySide.QtCore import *
import sys
import multiprocessing
import numpy as np
import cv2
from multiprocessing import Queue
def image_capture():
print(multiprocessing.current_process())
print("starting img proc")
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 641)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 351)
ret, frame = cap.read()
cap.release()
if ret == True:
cv2.imwrite('frame.png', frame)
return frame
class Maindialog(QMainWindow,examplegui.Ui_MainWindow):
pass_arguments = Signal(list)
def __init__(self,parent = None):
super(Maindialog,self).__init__(parent)
self.setupUi(self)
self.pool = multiprocessing.Pool(processes=4)
self.connect(self.excel_file,SIGNAL("clicked()"),self.apply_connection)
# self.pass_arguments.connect
def apply_connection(self):
print(multiprocessing.current_process())
result = self.pool.apply_async(image_capture,callback=self.show_img)
def show_img(self,result):
print(multiprocessing.current_process())
# print(result.type)
cv2.imshow("img",result)
image = QImage(result, result.shape[1], result.shape[0], result.strides[0], QImage.Format_RGB888)
self.vidimg.setPixmap(QPixmap.fromImage(image))
cv2.waitKey(0)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Maindialog()
window.show()
sys.exit(app.exec_())
である私は、イメージが実行されていることを確認するcv2.imshowをしましたが、私は、私はエラーに
QPixmap: It is not safe to use pixmaps outside the GUI thread
QPixmap: It is not safe to use pixmaps outside the GUI thread
QPixmap: It is not safe to use pixmaps outside the GUI thread
を取得PROGを実行GUI.When内のそのイメージを必要とします
誰かが間違っている場所を教えてもらえますか?
答えがあなたの問題を解決しましたRaghavendra? – ZF007
@ ZF007本当はね!しかし、私はこのエラーを回避するためにスレッドを使用し、それは私の問題のために正常に動作します。 –