J'utilise Visual Studio Express 2013 avec OpenCV 2.4.7
, Suite à cela tutoriel .
J'ai passé des heures à chercher des solutions sur le Web, y compris toutes les questions pertinentes SO. J'ai essayé:
la valeur de retour de VideoCapture::open
est 1
étendre le délai waitKey () à 50 ms et 500 ms plus tard
définir les dimensions de la fenêtre
création d'un autre projet sur Visual C++
ouvrir une image existante au lieu de la lire depuis la caméra (même erreur)
mais pas de chance, aidez-moi!
Voici mon code:
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <iostream>
using namespace std;
using namespace cv;
int main() {
Mat image;
VideoCapture cap;
int camOpen = cap.open(CV_CAP_ANY);
namedWindow("window", CV_WINDOW_AUTOSIZE);
while (true) {
cap >> image;
imshow("window", image);
// delay 33ms
waitKey(33);
}
}
En le compilant et en l'exécutant, j'ai eu l'erreur suivante:
Erreur OpenCV: Échec de l'assertion (size.width> 0 && size.height> 0) dans cv :: imshow, fichier ........\opencv\modules\highgui\src\window.cpp, ligne 261
Une erreur se produit sur la ligne imshow("window", image);
. Quand je l'ai commenté, il n'y a rien à redire.
MISES À JOUR:
Une explication plausible de la raison de cette erreur est que ma webcam prend du temps pour démarrer, c'est pourquoi image.empty () est vrai au départ, d'où la fonction abort () a été appelée pour quitter le programme.
Avec le code
if (!image.empty()) {
imshow("window", image);
}
nous pouvons attendre que la caméra démarre
J'ai essayé votre code et pour moi ça marche (il visualise l'entrée webcam actuelle)!
Je l'ai exécuté sur Visual Studio 2012 Ultimate avec OpenCV 2.4.7.
...
L'erreur se produit car l'image est vide, essayez donc ceci:
while (true) {
cap >> image;
if(!image.empty()){
imshow("window", image);
}
// delay 33ms
waitKey(33);
}
La première image que vous recevez de votre webcam est peut-être vide. Dans ce cas, imshow ne générera pas d'erreur. J'espère donc que les images d'entrée suivantes ne sont pas vides.
Faites ceci:
VideoCapture cap;
cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
int camOpen = cap.open(CV_CAP_ANY);
Ou vous pouvez essayer de changer cela:
while (true) {
cap >> image;
imshow("window", image);
// delay 33ms
waitKey(33);
}
à
try
{
cap >> image;
imshow("window", image);
waitKey(33);
}
catch (Exception& e)
{
const char* err_msg = e.what();
std::cout << "exception caught: imshow:\n" << err_msg << std::endl;
}
int i=0;
while(i<4)
{
VideoCapture cap(0); // force camera to open 4 tiMEs
i++;
}
waitKey(5000);
VideoCapture cap(0);
int camOpen = cap.open(CV_CAP_ANY);
namedWindow("window", CV_WINDOW_AUTOSIZE);
while (true) {
cap >> image;
imshow("window", image);
waitKey(33);
}
Faites cela, cela fonctionnera pour vous à coup sûr.