Impossible de lire des images à partir de VideoCapture secondaire webcam avec OpenCV
Code:
Exemple Simple qui fonctionne parfaitement avec primaire webcam (périphérique 0):
VideoCapture cap(0);
if (!cap.isOpened()) {
std::cout << "Unable to read stream from specified device." << std::endl;
return;
}
while (true)
{
//retrieve the frame:
Mat frame;
if (!cap.read(frame)) {
std::cout << "Unable to retrieve frame from video stream." << std::endl;
break;
}
//display it:
imshow("MyVideo", frame);
//check if Esc has been pressed:
if (waitKey(1) == 27) {
break;
}
//else continue:
}
cap.release();
Problème:
J'ai une deuxième webcam, que je voudrais utiliser. Cependant, lorsque je remplace VideoCapture cap(0);
avec VideoCapture cap(1);
, le flux est ouvert correctement (ou au moins cap.isOpened()
retourne true
) mais la cap.read(frame)
appel renvoie false
et je suis incapable de savoir pourquoi.
Ce que j'ai essayé:
-
J'ai essayé de jouer avec
VideoCapture
'paramètres un peu comme appeler:cap.set(CV_CAP_PROP_FORMAT, CV_8UC3);
et aléatoire des trucs comme ça, mais rien ne semble aider.
-
J'ai aussi trouvé ceci: VideoCapture::échec de lecture sur la vidéo non compressée (Bogue #2281), qui semble être résolu sur la version 2.4.7.. mais j'ai juste mis à jour OpenCV pour 2.4.8 et cela ne fonctionne toujours pas...
-
J'ai essayé d'utiliser le AMCap pour capturer la vidéo brute provenant de cette caméra, l'enregistrer en tant que
aaa.avi
fichier et construitVideoCapture
en appelant le:VideoCapture cap("aaa.avi");
et il fonctionne (lors de la lecture de fichier)... ce que j'ai besoin est un traitement en temps réel avec le live-view.
HARDWARE, OS, SW détails:
Mon HW: HP ProBook 4510s avec webcam intégrée qui fonctionne toujours parfaitement
+ webcam externe CANYON CNR-FWCII3, référencé par l'OS comme "USB Video Device" (le gênants un)
OS, SW: Windows 8.1 Pro x86, Visual Studio 2012 Pro, OpenCV 2.4.8 ~ à l'aide de vc11 construire
Questions:
- Suis-je raté quelque chose?
- Est-il autre chose que je pouvais faire?
- Est-il au moins quelque sorte comment faire pour récupérer quelques informations supplémentaires à propos de ce que le problème pourrait être en réalité?
... OpenCV l'API semble assez pauvre dans ce cas, et partout où les gens semblaient être confrontés au même problème, il y avait quelqu'un qui prétend être "OS /HW depnendant" comme une excuse.
Toute aide sera appréciée.
Oui, j'en suis sûr. Le truc, c'est... au lieu de deviner les causes possibles, il serait bien si il y a un moyen d'obtenir plus d'infos.
On pourrait appeler de la pac.get(i) et d'imprimer les différentes propriétés. Que serait vous donner quelques infos, voir ici
Par curiosité j'ai essayé de savoir si
read
échoue toujours et j'ai trouvé que c'est seulement le premier appel qui ne parvient pas -_-Intéressant, c'est peut-être le choix du moment opportun? Comme dans la photo n'est pas prêt à saisir pour quelques ms? Qu'advient-il si vous le sommeil ou la boucle à travers un large éventail avant de la première capture?
OriginalL'auteur LihO | 2014-02-25
Vous devez vous connecter pour publier un commentaire.
Après quelque temps, j'ai découvert qu'il est toujours seul le premier appel de
read
qui ne parvient pas à sauter la première image a commencé à fonctionner même si la véritable raison de ce comportement est resté inconnu.Plus tard James Barnett (voir commentaires ci-dessus) a souligné que la raison pourrait être qu'il faut à un moment jusqu'à ce que l'appareil photo est prêt pour la capture et ma solution actuelle ressemble la façon suivante (en C++11 de sommeil):
J'espère que certains futurs visiteurs trouveront utile 🙂
OriginalL'auteur LihO
meilleure façon de le résoudre est de lire une fois avant de vérifier pour la réussite. Cet extrait de code qui fonctionne pour moi.
//
//
...
cap.read
appel dans le code d'origine mais encore, il n'était pas suffisant dans mon cas. Je pense que cela pourrait être matériel / environnement spécifique.OriginalL'auteur Saurav Bhaumick