View  Edit  Attributes  History  Attach  Print  Search

PYQTLAB

PyQt Lab' : PyQt + OpenCV : Afficher un simple fichier image dans une fenêtre PyQt

Par X. HINAULT - Juin 2013

Ce que l'on va faire ici

  • Dans ce code PyQt, interface permettant d'afficher un simple fichier image dans une fenêtre PyQt. Le truc consiste à utiliser un QLabel normalement destiné à afficher du texte. Ce code basique ne redimensionne pas l'image qui devra être de taille 320x240 pixels.
  • Une image de test à placer dans le même répertoire que les codes *.py et *Main.py qui suivent :

Pré-requis

Téléchargement :

$ cd scripts_pyqt
$ mkdir  tuto_pyqt_opencv_load_image
$ cd tuto_pyqt_opencv_load_image
$ wget -4 -N https://raw.github.com/sensor56/PyQt-Lab/master/OpenCV/tuto_pyqt_opencv_load_image/tuto_pyqt_opencv_load_image.py
$ wget -4 -N https://raw.github.com/sensor56/PyQt-Lab/master/OpenCV/tuto_pyqt_opencv_load_image/tuto_pyqt_opencv_load_imageMain.py

Le fichier d'interface *.py

  • Fichier obtenu automatiquement avec l'utilitaire pyuic4 à partir du fichier *.ui créé avec QtDesigner :
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file
#
# Created: Tue Dec 11 20:46:06 2012
#      by: PyQt4 UI code generator 4.9.1
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(341, 264)
        self.labelImage = QtGui.QLabel(Form)
        self.labelImage.setGeometry(QtCore.QRect(10, 10, 320, 240))
        self.labelImage.setFrameShape(QtGui.QFrame.Box)
        self.labelImage.setFrameShadow(QtGui.QFrame.Sunken)
        self.labelImage.setText(_fromUtf8(""))
        self.labelImage.setObjectName(_fromUtf8("labelImage"))

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "load Image", None, QtGui.QApplication.UnicodeUTF8))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Form = QtGui.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())
 

Le fichier d'application *Main.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Par X. HINAULT - Tous droits réservés - GPLv3
# Déc 2012 - www.mon-club-elec.fr

# --- importation des modules utiles ---
from PyQt4.QtGui import *
from PyQt4.QtCore import * # inclut QTimer..

import os,sys
from cv2 import * # importe module OpenCV - cv est un sous module de cv2

sys.path.insert(0,'/home/xavier') # si pas path système
from pyqtcv import * # importe librairie perso comportant fonctions utiles pour utiliser opencv avec pyqt

# --- importation du fichier de description GUI ---
from tuto_pyqt_opencv_load_image import *

# --- classe principale du programme pyQt contenant le code actif ---
class myApp(QWidget, Ui_Form):
# la classe reçoit le Qwidget principal ET la classe Ui_Form définie dans *.py obtenu avec pyuic4

        # Note : ici self représente la classe

        def __init__(self, parent=None):
                QWidget.__init__(self) # initialise le Qwidget principal
                self.setupUi(parent) # Obligatoire

                #-- variables utiles --

                #--- code actif initial
                self.iplImage=cv.LoadImage("test.jpg", cv.CV_LOAD_IMAGE_COLOR) # charge l'image sous forme d'une iplImage 3 canaux
                self.qImage=IplToQImage(self.iplImage) # récupère l'IplImage dans un QImage - fonction pyqtcv
                self.qPixmap=QPixmap.fromImage(self.qImage) # récupère le QImage dans un QPixmap
                self.labelImage.setPixmap(self.qPixmap) # affiche l'image dans le label
                # NB : pour éviter les problèmes, les objets de manipulation d'image doivent être "self"

# fonction principale exécutant l'application Qt                       
def main(args):
        a=QApplication(args) # crée l'objet application
        f=QWidget() # crée le QWidget racine
        c=myApp(f) # appelle la classe contenant le code de l'application
        f.show() # affiche la fenêtre QWidget
        r=a.exec_() # lance l'exécution de l'application
        return r

# pour rendre le fichier *.py exécutable
if __name__=="__main__": # pour rendre le code exécutable
        main(sys.argv) # appelle la fonction main

Utilisation

  • Les 2 fichiers suivants sont à enregistrer dans un même répertoire, l'un en nom.py et l'autre en nomMain.py.
  • Puis lancer l'application depuis Geany ou équivalent, en exécutant le fichier nomMain.py
  • L'image est chargée dans la fenêtre PyQt : tout bête.