J'ai très simplement une application écrite en QT dans laquelle je veux afficher un film en utilisant QMediaPlayer
, mais avant d'afficher un cadre je voudrais y détecter quelques objets et les marquer en dessinant un rectangle dessus. J'ai lu dans http://doc.qt.io/qt-5/videooverview.html que je peux accéder à chaque image en sous-classes QAbstractVideoSurface
et ainsi je l'ai dit.Modifier et afficher QVideoFrames obtenu dans QAbstractVideoSurface
class VideoSurface : public QAbstractVideoSurface {
Q_OBJECT
bool present(const QVideoFrame &frame) override {
if (surfaceFormat().pixelFormat() != frame.pixelFormat()
|| surfaceFormat().frameSize() != frame.size()) {
setError(IncorrectFormatError);
stop();
return false;
} else {
currentFrame = frame;
return true;
}
}
...
}
Maintenant, je reçois dans cette fonction membre trames que je veux modifier en dessinant dessus des rectangles dans des endroits où je Détecté des objets et je voudrais les afficher sur l'écran (de préférence sur certains widget de) .
Comment est-ce que je peux faire ceci?
Si ma
VideoSurface
classe contiennentQWidget
en tant que membre? ou devrais-je sous-classeQWidget
qui contiendraVideoSurface
?Dans les deux cas, comment puis-je afficher cette image? Dois-je d'abord le convertir en
QImage
et ensuite afficher (ce serait convinien pour moi, parce que mon système de détection fonctionne avecQImage
, mais serait-il efficace)? Je sais que je ne peux pas peindre à l'extérieur d'un événement de peinture, donc je ne peux pas peindre dans la fonctionpresent
, alors où exactement devrait être cette fonction de peinture et comment je peux l'appeler?Où dois-je détecter ces objets et modifier la trame? En
present
fonction, ou dans la fonction de dessin?