9 votes

Intégrer une fenêtre OpenCV dans une interface graphique Qt

OpenCV récemment a modernisé sa vitrine lorsqu'il est utilisé dans Qt. Il semble très bien, mais je n'ai trouvé aucune possibilité de l'intégrer dans une fenêtre GUI Qt existante. La seule possibilité semble être la création d'une fenêtre de type cvNamedWindow o cv::namedWindow mais il crée une fenêtre indépendante flottante.

Est-il possible de créer cette fenêtre OpenCV ? à l'intérieur de une interface graphique existante ? Tout ce que j'ai pu trouver sur les forums OpenCV est une question sans réponse qui ressemble un peu à la mienne.

Il existe une méthode directe possibilité d'afficher une image OpenCV dans Qt mais il a deux problèmes majeurs :

  1. cela implique de copier l'image pixel par pixel, et c'est assez lent. Il y a des appels de fonction pour chaque pixel ! (dans mon application de test, si je crée une vidéo à partir des images, et que je l'affiche dans une fenêtre cvNamedWindow il fonctionne très bien, même pour plusieurs vidéos en même temps, mais si je passe par la section IplImage --> QImage --> QPixmap --> QLabel route, il a un décalage sévère même pour une seule vidéo)
  2. Je ne peux pas utiliser les nouvelles commandes de l'ordinateur. cvNamedWindow avec elle.

9voto

ypnos Points 21940

Tout d'abord, la conversion des images n'est pas aussi inefficace que vous le pensez. Les "appels de fonction" par pixel, du moins dans mon code (l'une des réponses à la question que vous avez mentionnée), sont intégrés par une compilation optimisée.

Deuxièmement, le code dans highgui/imshow fait la même chose. Vous devez passer de la matrice à une image ARGB dans les deux cas. La conversion QImage -> QPixmap n'est essentiellement rien d'autre que le déplacement des données de la mémoire principale vers la mémoire du GPU. C'est également la raison pour laquelle vous ne pouvez pas accéder directement aux données QPixmap et devez passer par QImage.

Troisièmement, il est plusieurs fois plus rapide si vous utilisez un QGLWidget pour dessiner l'image, et je suppose que vous avez activé QT_OPENGL dans votre build OpenCV. J'utilise QPainter pour dessiner le QPixmap dans un QGLWidget, et la vitesse n'est pas un problème. Voici un exemple de code :

http://sourceforge.net/p/gerbil/svn/19/tree/gerbil-gui/scaledview.h

http://sourceforge.net/p/gerbil/svn/19/tree/gerbil-gui/scaledview.cpp

Revenons à votre question initiale : Votre option actuelle est de prendre le code d'OpenCV, de l'inclure dans votre projet sous un espace de nom différent et de le modifier pour l'adapter à vos besoins. En dehors de cela, vous n'avez pas d'alternative pour le moment. Le highgui d'OpenCV utilise sa propre boucle d'événements, sa connexion au serveur X, etc. et il n'y a rien que vous puissiez intercepter.

0voto

gankoji Points 773

Ma première idée est de vouloir dire ceci : Je suis sûr que si vous creusez dans le code de namedWindow, vous trouverez qu'ils utilisent une sorte d'objet standard, bien que peu référencé, pour peindre ladite fenêtre (c'est dans le code openCV). Si vous étiez assez ambitieux, vous pourriez étendre cette classe vous-même, pour vous interfacer directement avec un cadre ou un widget personnalisé dans Qt. Il pourrait même y avoir un moyen de prendre la fenêtre entière et de l'intégrer, en utilisant une méthode similaire à celle d'un cadre Qt, ou une extension de la classe (générale) des widgets. C'est une question très intéressante qui se rapporte assez directement au travail que j'ai fait ces derniers temps, donc je vais continuer à y réfléchir et à faire des recherches et voir si je ne peux pas proposer quelque chose de plus utile.

[Quels sont les nouveaux contrôles spécifiques qui vous intéressent tant ? Il pourrait être plus efficace de la part du programmeur d'étendre un contrôle Qt pour émuler cela, par opposition à ma première suggestion[/EDIT].

-6voto

Vérifiez simplement l'implémentation opencv highgui. si je me souviens bien, elle utilise qt.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X