QPixmap et QGraphicsPixmapItem
Bonjour,
je suis en train de me créer un petit utilitaire de prise de photo via un flux vidéo issu d'une caméra.
j'utilise un empilage d'objet comme suivant:
Code:
1 2 3 4 5 6 7 8 9
| self.videoWidget = QVideoWidget()
self.videoWidget.setStyleSheet("QVideoWidget{background: black}")
self.scene=QGraphicsScene()
self.view =QGraphicsView()
self.view.setScene(self.scene)
self.view.setStyleSheet("QGraphicsView{background: transparent}")
self.scene.addWidget(self.videoWidget)
self.resox=640
self.resoy=480 |
Ensuite je m'arrange à détecter ma camera via:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| cameraDevice = QByteArray()
videoDevicesGroup = QActionGroup(self)
videoDevicesGroup.setExclusive(True)
for deviceName in QCamera.availableDevices():
description = QCamera.deviceDescription(deviceName)
videoDeviceAction = QAction(description, videoDevicesGroup)
videoDeviceAction.setCheckable(True)
videoDeviceAction.setData(deviceName)
if cameraDevice.isEmpty():
cameraDevice = deviceName
videoDeviceAction.setChecked(True)
self.menucameras.addAction(videoDeviceAction)
videoDevicesGroup.triggered.connect(self.updateCameraDevice) |
Ensuite, je sélectionne la camera avec une fonction:
Code:
1 2 3 4 5 6
| def setCamera(self, cameraDevice):
if cameraDevice.isEmpty():
self.camera = QCamera()
else:
self.camera = QCamera(cameraDevice)
self.camera.setViewfinder(self.videoWidget) |
La prise de photo est gérée par l'ensemble des fonctions ci-dessous:
Code:
1 2 3 4 5 6 7 8
| def takeImage(self):
self.isCapturingImage = True
self.imageCapture.capture()
def readyForCapture(self, ready):
self.bouton_stop.setEnabled(ready)
def processCapturedImage(self, requestId, img):
self.image_originale = img.scaled(self.resox,self.resoy, Qt.KeepAspectRatio,Qt.SmoothTransformation)
self.item_issu_originale=self.scene.addPixmap(QPixmap.fromImage(self.image_originale)) |
Donc arrivée à ce stade, j'ai un joli arrêt sur image dans ma scene (la caméra tourne toujours derrière) et je peux sauvegarder la chose via:
Code:
self.image_originale.save(chemin, "PNG",-1)
lors du visionnage de ma capture, je me suis arrangé à pouvoir surimposer des items (traits)... et j'aimerais pouvoir enregistrer ces items avec la photo.
mais ma photo présente un type "QGraphicsPixmapItem"
et mes items un type: "QPixmap".
En première approche, pour "fusionner" photo/items, j'ai pensé aux lignes suivantes:
Code:
1 2 3
| self.overlays_legende=QPixmap(self.resox,self.resoy)
painter5=QPainter(self.overlays_legende)
self.scene.render(painter5) |
1ère question: Est-ce que la logique de fonctionnement globale ne vous parait pas maladroite, lourde ou inadaptée?
2ième question: Utilliser les Pixmap est-il judicieux ou est-ce qu'il existe un format plus maniable (mon premier but est d'avoir des images de qualité).
3ième question: Quelle est vraiment la différence entre QPixmap et QGraphicsPixmapItem?
4ième question: Comment fusionner proprement mes items à ma photo?
Merci pour votre aide :-)