4 trajectoireWidget, a module for pymecavideo:
5 a program to track moving points
in a video frameset
7 Copyright (C) 2007 Jean-Baptiste Butet <ashashiwa
@gmail.com>
8 Copyright (C) 2023 Georges Khaznadar <georgesk
@debian.org>
10 This program
is free software: you can redistribute it
and/
or modify
11 it under the terms of the GNU General Public License
as published by
12 the Free Software Foundation, either version 3 of the License,
or
13 (at your option) any later version.
15 This program
is distributed
in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License
for more details.
20 You should have received a copy of the GNU General Public License
21 along
with this program. If
not, see <http://www.gnu.org/licenses/>.
24from PyQt6.QtCore import QThread, pyqtSignal, QLocale, QTranslator, Qt, \
25 QSize, QTimer, QObject, QRect, QPoint, QPointF, QEvent
26from PyQt6.QtGui
import QKeySequence, QIcon, QPixmap, QImage, QPainter, \
27 QCursor, QPen, QColor, QFont, QResizeEvent, QShortcut
28from PyQt6.QtWidgets
import QApplication, QMainWindow, QWidget, QLayout, \
29 QFileDialog, QTableWidgetItem, QInputDialog, QLineEdit, QMessageBox, \
30 QTableWidgetSelectionRange
32import os, time, re, sys
35from version
import Version
36from vecteur
import vecteur
37from image_widget
import ImageWidget
38from globdef
import cible_icon, DOCUMENT_PATH, inhibe, pattern_float
39from toQimage
import toQImage
40from suivi_auto
import SelRectWidget
41from detect
import filter_picture
42from cadreur
import Cadreur, openCvReader
45import interfaces.icon_rc
47from interfaces.Ui_trajectoire
import Ui_trajectoire
48from etatsTraj
import Etats
52 Le widget principal de l'onglet des trajectoires
54 Paramètres du constructeur :
55 @param parent l
'onglet des trajectoires
57 def __init__(self, parent):
58 QWidget.__init__(self, parent)
59 Ui_trajectoire.__init__(self)
67 trace = pyqtSignal(str)
71 Crée des pointeurs locaux vers les widgets importants, le débogueur
72 et les préférences ; connecte aussi les widgets importants dans
73 le sous-widget self.trajW
77 self.prefs = app.prefs
79 self.video = app.pointage.video
83 self.
trajW.trajectoire = self
88 Connecte les signaux des sous-widgets
105 Récupère les préférences sauvegardées, et en applique les données
106 ici on s'occupe de ce qui se gère facilement au niveau de la
109 self.dbg.p(2, "rentre dans 'trajectoireWidget.apply_preferences'")
110 d = self.
prefs.config[
"DEFAULT"]
114 def enregistreChrono(self):
117 base_name = os.path.splitext(os.path.basename(self.
pointage.filename))[0]
118 defaultName = os.path.join(DOCUMENT_PATH, base_name)
119 fichier = QFileDialog.getSaveFileName(self,
120 self.tr(
"Enregistrer comme image"),
121 defaultName, self.tr(
"fichiers images(*.png *.jpg)"))
124 except Exception
as err:
125 self.
dbg.p(3, f
"***Exception*** {err} at line {get_linenumber()}")
126 QMessageBox.critical(
None, self.tr(
"Erreur lors de l'enregistrement"), self.tr(
"Echec de l'enregistrement du fichier:<b>\n{0}</b>").format(
130 """lance la sauvegarde du trajW.
131 Si chronophotographie, on ajoute l'image et la trace de l'échelle comme pointée.
132 Si chronophotogramme, on ne met pas l
'image et la trace est en haut.
137 self.
trajW.setEnabled(
True)
141 self.
trajW.setEnabled(
False)
149 self.
trajW.setEnabled(
False)
152 self.
dbg.p(2,
"rentre dans 'chronoPhoto'")
154 liste_types_photos = [
'chronophotographie',
'chronophotogramme']
157 photo_chrono = liste_types_photos[self.
comboBoxChrono.currentIndex(
159 self.
dbg.p(2,
"dans 'chronoPhoto, on a choisi le type %s'" %
161 if photo_chrono ==
'chronophotographie':
162 self.
trajW.chrono = 1
163 ok, img = self.
pointage.cvReader.getImage(
170 self.
trajW.chrono = 2
171 self.
trajW.setImage(QPixmap())
174 self.
trajW.setImage(QPixmap())
175 self.
trajW.chrono = 0
176 self.
app.redimensionneFenetre()
180 def changeChronoImg(self,img):
186 Quand on veut afficher le vecteur vitesse,
187 on active le spinbox qui permet de choisir une échelle.
188 Quand on ne veut plus, on peut cacher le spinbox.
189 @param secondParam peu utile mais nécessaire : certains modes
190 de rappel de cette fonction ont un paramètre supplémentaire
192 self.dbg.p(2, "rentre dans 'enableSpeed'")
194 self.
dbg.p(2,
"In enableSpeed")
200 self.
trajW.prepare_vecteurs_pour_paint()
209 def montre_video(self):
210 self.
dbg.p(2,
"rentre dans 'montre_video'")
212 if len(ref) == 0
or ref ==
"camera":
220 fonction de rappel du signal "trace"
221 Cette fonction est appelée par un changement de référentiel.
222 On peut aussi appeler cette fonction directement, auquel cas on
223 donne la valeur
"absolu" à newValue pour reconnaître ce cas.
224 efface les trajectoires anciennes, puis
225 trace les trajectoires en fonction du référentiel choisi.
227 @param laquelle désignation de la trajectoire (
"absolu" = réf. camera)
229 self.dbg.p(2, "rentre dans 'traceTrajectoire'")
231 if laquelle ==
"absolu":
242 elif choix_ref ==
"camera":
245 ref = int(choix_ref.split(
" ")[-1])
248 self.
trajW.chrono =
False
250 self.
trajW.origine = origine
251 self.
trajW.origine_mvt = origine
252 self.
trajW.referentiel = ref
254 self.
trajW.referentiel = 0
256 self.
dbg.p(3,
"origine %s, ref %s" %
257 (str(self.
trajW.origine), str(ref)))
258 self.
trajW.prepare_vecteurs_pour_paint()
Un objet capable de recadrer une vidéo en suivant le déplacement d'un point donné.
Une classe qui permet de définir les états pour le ccordWidget debut, A, AB, B, C,...
radioButtonSpeedEveryWhere
def setupUi(self, trajectoire)
une classe pour des vecteurs 2D ; les coordonnées sont flottantes, et on peut accéder à celles-ci par...