ouvrir webcamera avec OpenCV et de le montrer avec QLabel - blanc fenêtre
Je travaille sur Win7 x64 avec OpenCV et Bibliothèques Qt et VS 2010.
J'aimerais ouvrir mon appareil photo avec OpenCV et puis pour afficher les images capturées avec Qt, par exemple à l'aide de QLabel, après la conversion à partir de Tapis de QImage.
Je veux le faire parce que pour utiliser les fonctions imshow("appareil photo", image) et waitKey() ralentit le streaming de la caméra.
C'est mon code:
int main () {
QApplication a(argc, argv);
QLabel myLabel;
VideoCapture cap(0);
//namedWindow(c"camera", 1);
for (;;) {
cap >> image;
//conversion from Mat to QImage
Mat dest;
cvtColor(image, dest,CV_BGR2RGB);
QImage image1= QImage((uchar*) dest.data, dest.cols, dest.rows, dest.step, QImage::Format_RGB888);
//show Qimage using QLabel
myLabel.setPixmap(QPixmap::fromImage(image1));
myLabel.show();
//imshow("camera",image);
//if (waitKey(30)>= 0) break;
}
return a.exec();
}
Webcam est ouvert correctement et fonctionne, Mais je vois une fenêtre blanche et pas les images capturées, comme vous pouvez le voir dans cette image
Si je ne commentez: namedWindow (..), imshow(..), if(waitKey(..)
, il fonctionne (j'en vois deux fenêtres avec les mêmes images), mais je afficher les images capturées avec OpenCV et c'est ce que je veux éviter.
Ma question est: je suis mauvais en quelque chose?? Je ne sais pas, la conversion à partir de Tapis de Qimage est le problème ??..
Ou, je ne peux pas afficher les images capturées uniquement avec Qt?
Merci!
OriginalL'auteur Cristina1986 | 2013-02-06
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas beaucoup d'expérience, mais je peux voir ce qui peut aller mal ici:
Vous le faites dans le morts en boucle, il sera la cause de votre QLabel pour mettre à jour lui-même à l'infini, de sorte que vous ne pouvez pas voir quoi que ce soit. Aussi, si décommentant
waitKey
est de vous aider, c'est à peu près signifie que vous êtes à la conversion des données àQImage
bien, mais autre chose est cassé.Noter que
a.exec()
ne s'exécutera jamais, tant que vous serez coincé dans la boucle, mais je suppose que c'était assez pour frapper le concept.Afin de ne pas coincé boucle d'événement, vous devez créer
QTimer
et toutes les x millisecondes pour mettre à jour votre widget:Il est venu à mon esprit - je modifier ma réponse. Merci!
Merci beaucoup pour votre réponse! J'ai essayé de copier votre code dans mon fichier .rpc (appelé: "main_proiezione.cpp"), mais quand je l'execute, je reçois ce message sur le terminal:
Object::connect: No such slot QWidget::updatePicture() in c:\ ...
(mon "main_proiezione.cpp" chemin d'accès du fichier). Désolé, je ne suis pas très bon avec de la programmation.J'ai oublié macro q_object dans ma réponse! Essayez-le maintenant.
Est-il une erreur dans ce code? la ligne dans le constructeur qui commence à se connecter manque une parenthèse à la fin.
OriginalL'auteur Nemanja Boric
Essayez ceci dans l'
paintEvent()
le widget (widget/mainwindow) que vous souhaitez utiliser pour afficher l'image.Ouvrir l'appareil photo dans le constructeur de la widget:
dans le
paintEvent()
ce fairel'aide d'une minuterie vous pouvez connecter le
timeout
SIGNAL à laupdate
emplacement du widget. utiliser un intervalle de 20 à 40 ms. Comme si vous faites un bouton poussoir pour démarrer l'appareil photo, placez le code suivant dans sesclicked
LOGEMENT.OriginalL'auteur rotating_image
Si vous êtes paramètre pour démarrer la Capture Vidéo de l'Étiquette, alors vous devez écrire ce code comme celui de la RPC:
Ce code fonctionne vraiment bien pour moi, je l'espère, il sera également vous aider.
dans l'en-Tête:
OriginalL'auteur Muhammad Athar Jan