Affichage d'une image à l'aide d'OpenCV 2.2 sur un Linux Ubuntu plate-forme avec Qt
Hé les gars,
Je suis en utilisant Qt que mon C++ IDE plate-forme sur Ubuntu 10.10 avec OpenCV 2.2.
Je vais juste écrire des morceaux de code et de montrer où est le problème:
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
int main(int argc, char *argv[])
{
VideoCapture cap = VideoCapture(0);
Mat frame;
do
{
cap >> frame;
imshow("frame",frame);
} while (waitKey(10) != 27);
return 0;
}
Je reçois 3 avertissement les impressions qui semble quelque chose comme ceci:
VIDIOC_QUERYMENU: Invalid argument
Et tout semble aller pour le mieux (la caméra fonctionne).
J'ai dû ajouter de l'utilisation de l'intervalle Qt et ajouter 3 lignes de code, et il ressemble à ceci:
#include <QApplication>
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
int main(int argc, char *argv[])
{
QApplication app(argc,argv);
VideoCapture cap = VideoCapture(0);
Mat frame;
do
{
cap >> frame;
imshow("frame",frame);
} while (waitKey(10) != 27);
return app.exec();
}
Que j'ai toujours l'avertissement 3 lignes, mais maintenant, le "cadre" de la fenêtre est gris, et rien n'est visible.
C'est ma première fois en utilisant Qt, donc je ne sais pas vraiment comment il fonctionne. Je ne peux que deviner que QApplication est d'obtenir le contrôle sur la gestion de la fenêtre, qui provoque la imshow
commande de ne pas être en mesure d'ouvrir une nouvelle fenêtre.
Je vous remercie de votre aide,
THNX!
OriginalL'auteur Royi Freifeld | 2011-03-02
Vous devez vous connecter pour publier un commentaire.
Votre problème est avec Qt de la manipulation de son propre boucle d'événement et ainsi, la boucle d'événement de OpenCV est morte de faim et ne jamais exécuter.
La façon de les amener à travailler ensemble est assez simple: à l'Affichage de votre OpenCV comme un QPixmap (par convertir votre image pour QImage ensuite utiliser QLabel pour l'afficher). Ajoutez ensuite cette QLabel pour votre QWidget. Votre QWidget peuvent être incorporés ou devenir le widget principal de votre QApplication.
D'utiliser le tampon de votre cv::Mat image de votre QImage, voir cette réponse comment faire pour convertir un opencv cv::Mat pour qimage
Pour afficher cette QImage, voir
Affichage QImage avec QtGui
OriginalL'auteur Dat Chu
Votre hypothèse n'est pas correcte. OpenCV aura sa propre connexion au serveur X et de ne pas être affecté par Qt de la gestion de la fenêtre (cependant, waitKey() gestion des données et l'application.exec() ne sera pas trivialement travailler en parallèle).
J'ai aussi testé un code similaire pour repérer toute des effets secondaires imprévisibles. Toutes les fenêtres sont le dessin bien sur ma machine Debian avec OpenCV 2.2 et Qt 4.6.2.
Un banal test de votre côté pourrait être de créer l'objet application juste après votre boucle while. Cependant, il est peut-être le changement aléatoire dans votre pile de mise en page que la cause de vos mises en garde de devenir un problème grave? Vous devriez également vérifier avec valgrind.
OriginalL'auteur ypnos
Vous ne pouvez pas mélanger openCV du contrôle de la boucle d'événement de qt et de l'application.exec
Soit utiliser l'intervalle Qt saveur de la cvNamedWindow, ou simple prenez des images à partir d'openCV et de les afficher dans un QLabel. Ou mieux hérite de QWidget et écrire votre propre QImage peintre
OriginalL'auteur Martin Beckett
J'ai été confronté à un problème similaire récemment (l'affichage de la webcam de l'information à l'aide d'OpenCV et Qt comme la finale de GUI). Le meilleur moyen que j'ai trouver pour lire la vidéo (qui est en fait un ensemble d'images) est d'utiliser un GLWidget. Dans ce GLWidget vous pouvez créer un rectangle et joindre une texture à elle, là où la texture est l'image que vous souhaitez afficher. Un autre problème est que le format de l'image est différente pour OpenCV et OpenGL, mais vous pouvez facilement changer le format en changeant l'ordre des chaînes.
Dans votre code, vous êtes la création d'un QApplication qui dispose de sa propre inactive processus, de sorte que vous n'atteindrez jamais votre boucle while. Vous aussi vous n'avez pas créé de Qt fenêtre d'affichage, je vous recommande de vérifier les exemples qui viennent avec Qt pour vérifier la structure de base de l'application et de commencer avec une QMainWindow ou un QDialog.
Les étapes sont les suivantes:
Cela dépend de ce que vous jugez nécessaires, bien sûr. Le code qu'il a écrit est la réception d'une nouvelle image à chaque itération de la boucle while. Dans mon expérience, seulement en utilisant OpenGL, j'ai été en mesure d'éviter le scintillement dans une vidéo (c'est ce que je suis supposé qu'il est en train d'essayer de l'afficher).
OriginalL'auteur sergi