|
from uidir import show
|
|
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QMessageBox, QTableWidgetItem
|
|
from PyQt5.QtGui import QIcon, QImage, QPixmap
|
|
from PyQt5.QtCore import QThread
|
|
import sys
|
|
import os
|
|
import cv2
|
|
import numpy as np
|
|
|
|
|
|
'''Voici le multi-processus dans pyqt5 pour afficher des images et éviter le blocage de l'interface'''
|
|
class imageThread(QThread):
|
|
def __init__(self, image):
|
|
super().__init__()
|
|
self.image = image
|
|
|
|
def run(self):
|
|
image = self.image
|
|
try:
|
|
# print(image.shape, 'cv')
|
|
Qimag = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) # Convertir le canal de l'image de RVB en BGR
|
|
except Exception as e:
|
|
Qimag = np.array(image) # Converti en type numpy, notez que (w, h) -> (h, w, 3)
|
|
# print(Qimag.shape, 'QIMage')
|
|
(imageH, imageW) = Qimag.shape[0:2] # Trouvez la largeur et la hauteur de l'image
|
|
QiM = QImage(Qimag.data, imageW, imageH,
|
|
imageW * 3, QImage.Format_RGB888) # Convertir le format de données d'image
|
|
return QiM
|
|
# ui..setPixmap(QPixmap.fromImage(QiM))
|
|
|
|
# Ouvrez l'interface de sélection des fichiers
|
|
def select_image():
|
|
try:
|
|
filename, filetype = QFileDialog.getOpenFileName(mainwindow, "sélectionner l'image ", 'F:', "Text Files (*.jpg);;All Files (*)")
|
|
# ouvrir l'interface de sélection des fichier et sélectionner
|
|
image = cv2.imdecode(np.fromfile(filename, dtype=np.uint8), 1) # Lire l'image
|
|
if image.shape[0] > 1000: # L'image est trop grande ,il a besoin de réduire la taille
|
|
image = cv2.resize(image, (int(image.shape[1]*0.3), int(image.shape[0]*0.3)), interpolation=cv2.INTER_AREA)
|
|
p = imageThread(image) # Démarrer le thread
|
|
image = p.run() # exécuter le thread
|
|
ui.show_image.setPixmap(QPixmap.fromImage(image)) # afficher l'image sur l'interface
|
|
except Exception as e:
|
|
# print(e)
|
|
pass
|
|
|
|
# sélectionner la camera
|
|
def select_camara():
|
|
try:
|
|
label = ui.which_camara.currentText() # Obtenez le numéro de caméra à sélectionner
|
|
if label == 'local camera':
|
|
label = 0
|
|
elif label == 'external camera':
|
|
label = 1
|
|
cap = cv2.VideoCapture(label, cv2.CAP_DSHOW) # L'ajout du deuxième paramètre peut éviter certains avertissements, cette fonction est pour ouvrir la caméra
|
|
print(cap.isOpened()) # cap.isOpened()Cette fonction renvoie le résultat indiquant est-ce que la caméra est ouverte
|
|
if cap.isOpened():
|
|
_, frame = cap.read() # Lire la première frame de l'image
|
|
p = imageThread(frame) # Démarrer le thread
|
|
image = p.run() # exécuter le thread
|
|
ui.show_image.setPixmap(QPixmap.fromImage(image)) #afficher l'image sur l'interface
|
|
except Exception as e:
|
|
print(e)
|
|
pass
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
app = QApplication(sys.argv)
|
|
mainwindow = QMainWindow()
|
|
ui = show.Ui_MainWindow()
|
|
ui.setupUi(mainwindow)
|
|
mainwindow.setWindowTitle('Image display') # nommer l'interface
|
|
# mainwindow.setWindowIcon(QIcon('logo.ico'))
|
|
|
|
mainwindow.show()
|
|
ui.select_image.clicked.connect(select_image) # Cliquez sur le bouton pour déclencher la fonction
|
|
ui.select_camara.clicked.connect(select_camara)
|
|
sys.exit(app.exec_())
|