L'incorporation d'une OpenCV fenêtre dans un Qt GUI
OpenCV récemment mise à niveau de sa fenêtre d'affichage, lorsqu'il est utilisé dans Qt.
Il a l'air très bon, cependant je n'ai trouvé aucune possibilité pour qu'il soit intégré dans un Qt GUI fenêtre. La seule possibilité semble être la création d'un cvNamedWindow
ou cv::namedWindow
, mais il crée un flottant fenêtre indépendante.
Est-il possible de créer que OpenCV fenêtre à l'intérieur de une interface? Tout ce que je pouvais trouver sur le OpenCV forums est une question sans réponse, un peu similaire à la mienne.
Il y a un straight-forward possibilité d'afficher une image OpenCV dans Qt, mais il a deux problèmes majeurs:
- il implique la copie de l'image pixel par pixel, et c'est assez lent. Il a des appels de fonction pour chaque pixel de l'! (dans mon test de l'application, si je créer une vidéo à partir des images, et de les afficher dans un
cvNamedWindow
, il fonctionne très bien, même pour plusieurs vidéos en même temps, mais si je passe par leIplImage
-->QImage
-->QPixmap
-->QLabel
route, il a de graves lag, même pour une seule vidéo) - Je ne peux pas utiliser ces belles nouvelles mesures de contrôle de la
cvNamedWindow
avec elle.
OriginalL'auteur vsz | 2012-07-29
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, la conversion d'image n'est pas aussi inefficace que vous le pensez. La fonction "appels" par pixel au moins dans mon code (l'une des réponses à la question que vous l'avez mentionné) sont intégrées à l'optimisation de la compilation.
Deuxième, le code de la highgui/imshow fait de même. Vous devez obtenir à partir de la matrice de l'ARGB image à l'autre. La conversion QImage -> QPixmap n'est essentiellement rien d'autre que de déplacer les données de la mémoire principale à la mémoire GPU. C'est aussi la raison pour laquelle vous ne pouvez pas accéder à la QPixmap données directement et doivent passer par QImage.
Troisième, il est plusieurs fois plus rapide si vous utilisez un QGLWidget de dessiner l'image, et je suppose que vous avez QT_OPENGL activé dans votre OpenCV construire. J'utilise QPainter pour dessiner le QPixmap dans un QGLWidget, et la vitesse n'est pas question. 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
Maintenant à votre question de départ: Votre option actuelle est de prendre le code de OpenCV, inclure dans votre projet sous un autre espace de noms, et de le modifier pour l'adapter à vos besoins. En dehors de cela, vous n'avez pas le choix maintenant. OpenCV est highgui utilise sa propre boucle d'événements, la connexion avec le serveur X etc. et il n'en est rien, vous pouvez intercepter.
cv::Mat
, mais comme c'est la même chose queIplImage
, il peut être utilisé même avec l'ancienne API.const uchar *qImageBuffer = (const uchar*)mat.data; QImage img(qImageBuffer, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
Tandis que le lié solution avec les boucles for imbriquées à la traîne sur mon système, celui-ci ne fonctionne pas.Tout d'abord, c'est un beau projet et bon à savoir. La solution proposée est limitée à une série de scénarios (Mat n'est pas BGR, mais RVB, les formats de données de match, Tapis objet survit à la QImage), mais vous omettez une duplication. Si cela fonctionne pour vous, c'est parfait! (Il ne fonctionne pas pour moi, pour les raisons mentionnées :).)
OriginalL'auteur ypnos
Ma première suppose que c'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 de norme, mais ce n'est pas souvent référencé, objet de la peinture, a déclaré la fenêtre (qui est dans le openCV code). Si vous avez été assez ambitieux, vous pouvez étendre cette classe vous-même, à l'interface directement à un cadre ou d'un widget personnalisé dans Qt. Il pourrait même être une façon de prendre l'intégralité de la fenêtre et à l'intégrer, à l'aide d'une méthode similaire, d'un Qt image, ou une extension de l' (général) classe de widget. C'est une question très intéressante et concerne plutôt directement au travail que je fais de la fin, donc je vais continuer d'y réfléchir et de la recherche et de voir si je ne peux pas venir avec quelque chose d'autre de plus utile.
[MODIFIER] Quels nouveaux contrôles êtes-vous intéressé? Il peut être plus efficace de la part du programmeur, pour prolonger l'intervalle Qt de contrôle pour émuler que, contrairement à ma première suggestion.[/EDIT]
OriginalL'auteur gankoji
il suffit de voir le opencv highgui mise en œuvre. je me souviens qu'il utilise qt.
vous avez tort. il n'était pas précisé dans la question, ni même mentionné dans la question. cette réponse est tout ce qui est nécessaire pour l'OP, je suis juste en supposant un non-idiot lecteur, et n'a pas à réfléchir sur la façon AFIN que les lecteurs ne correspondent pas à cette présomption.
C'est la première phrase de la question.
encore une fois, vous avez tort. "un travaille avec b" n'implique pas que "l'un est mis en œuvre en termes de b". cela dit, votre inadaptation s'applique uniquement à la deuxième phrase de ma réponse. la première phrase est ce que l'OP devrait le faire. que j'ai fait.
Merci de ne pas pinailler la mauvaise formulation. Pourquoi ne pas continuer la lecture de la première phrase dans le document qui est liée: "Ce chiffre explique les nouvelles fonctionnalités mises en œuvre avec Qt GUI". C'est bien que vous avez voulu donner une réponse rapide à la question, il n'est pas très utile.
OriginalL'auteur Cheers and hth. - Alf