main.py

dernière version - Benoit FAVIER, 11/12/2020 10:45 AM

Download (3.37 KB)

 
1
import show
2
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QMessageBox, QTableWidgetItem
3
from PyQt5.QtGui import QIcon, QImage, QPixmap
4
from PyQt5.QtCore import QThread
5
import sys
6
import os
7
import cv2
8
import numpy as np
9

    
10

    
11
'''Voici le multi-processus dans pyqt5 pour afficher des images et éviter le blocage de l'interface'''
12
class imageThread(QThread):
13
    def __init__(self, image):
14
        super().__init__()
15
        self.image = image
16

    
17
    def run(self):
18
        image = self.image
19
        try:
20
            # print(image.shape, 'cv')
21
            Qimag = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) # Convertir le canal de l'image de RVB en BGR
22
        except Exception as e:
23
            Qimag = np.array(image) # Converti en type numpy, notez que (w, h) -> (h, w, 3)
24
            # print(Qimag.shape, 'QIMage')
25
        (imageH, imageW) = Qimag.shape[0:2] # Trouvez la largeur et la hauteur de l'image
26
        QiM = QImage(Qimag.data, imageW, imageH,
27
                     imageW * 3, QImage.Format_RGB888) # Convertir le format de données d'image
28
        return QiM
29
        # ui..setPixmap(QPixmap.fromImage(QiM))
30

    
31
# Ouvrez l'interface de sélection des fichiers
32
def select_image():
33
    try:
34
        filename, filetype = QFileDialog.getOpenFileName(mainwindow, "sélectionner l'image ", 'F:', "Text Files (*.jpg);;All Files (*)")
35
        # ouvrir l'interface de sélection des fichier  et sélectionner
36
        image = cv2.imdecode(np.fromfile(filename, dtype=np.uint8), 1) # Lire l'image
37
        if image.shape[0] > 1000: # L'image est trop grande ,il a besoin de réduire la taille
38
            image = cv2.resize(image, (int(image.shape[1]*0.3), int(image.shape[0]*0.3)), interpolation=cv2.INTER_AREA)
39
        p = imageThread(image) # Démarrer le thread
40
        image = p.run() # exécuter le thread
41
        ui.show_image.setPixmap(QPixmap.fromImage(image)) # afficher l'image sur l'interface
42
    except Exception as e:
43
        # print(e)
44
        pass
45

    
46
# sélectionner la camera
47
def select_camara():
48
    try:
49
        label = ui.which_camara.currentText() # Obtenez le numéro de caméra à sélectionner
50
        if label == 'local camera':
51
            label = 0
52
        elif label == 'external camera':
53
            label = 1
54
        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
55
        print(cap.isOpened()) # cap.isOpened()Cette fonction renvoie le résultat indiquant est-ce que la caméra est ouverte
56
        if cap.isOpened():
57
            _, frame = cap.read() # Lire la première frame de l'image
58
            p = imageThread(frame) # Démarrer le thread
59
            image = p.run() # exécuter le thread
60
            ui.show_image.setPixmap(QPixmap.fromImage(image)) #afficher l'image sur l'interface
61
    except Exception as e:
62
        print(e)
63
        pass
64

    
65

    
66

    
67

    
68
if __name__ == '__main__':
69
    app = QApplication(sys.argv)
70
    mainwindow = QMainWindow()
71
    ui = show.Ui_MainWindow()
72
    ui.setupUi(mainwindow)
73
    mainwindow.setWindowTitle('Image display') # nommer l'interface
74
    # mainwindow.setWindowIcon(QIcon('logo.ico'))
75

    
76
    mainwindow.show()
77
    ui.select_image.clicked.connect(select_image) # Cliquez sur le bouton pour déclencher la fonction
78
    ui.select_camara.clicked.connect(select_camara)
79
    sys.exit(app.exec_())