web-dev-qa-db-fra.com

Échec de l'assertion (size.width> 0 && size.height> 0)

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

18
jytoronto

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.

16
Dennis

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;
}
0
72DFBF5B A0DF5BE9
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.

0