2017-01-11 4 views
-2

Je commence avec OpenCV et c'est l'API C, j'ai écrit ce programme de détection de visage mais il ne peut pas être exécuté, j'utilise OpenCV 2.4.9, voici mon Code:Programme OpenCV C++ utilisant l'API C cvClearMemStorage null Erreur de pointeur

#include "opencv/cv.h" 
#include "opencv/highgui.h" 
#include <cstdlib> 
#include <cstdio> 
#include <cstring> 
#include <iostream> 

using namespace cv; 
using namespace std; 
String faceCascade_name = "haarcascade_frontalface_default.xml"; 
char* name = "res"; 
CvHaarClassifierCascade* faceCascade; 
CvMemStorage* storage = 0; 

int detectAndDisplay(IplImage* frame); 

int main(int argc, char** argv){ 
    CvCapture* capture; 
    capture = cvCaptureFromCAM(CV_CAP_ANY); 
    faceCascade = (CvHaarClassifierCascade*)cvLoad(faceCascade_name.c_str()); 
    IplImage* frame; 
    cvNamedWindow(name, 1); 
    if(!faceCascade){ 
    printf("--(!)Error loading face cascade\n"); 
    return -1; 
    } 
    if (!capture) { 
    printf("--(!)Error opening video capture\n"); 
    return -1; 
    } 

    while(true){ 
    frame = cvQueryFrame(capture); 
    detectAndDisplay(frame); 
    if(cvWaitKey(30) == 27){ 
     break; 
    } 
    } 
    return 0; 
} 

int detectAndDisplay(IplImage* frame){ 
    int scale = 1; 
    int i; 
    CvPoint pt1, pt2; 
    cvClearMemStorage(storage); 
    CvSeq* faces = cvHaarDetectObjects(&frame, faceCascade, storage, 1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/, cvSize(24, 24)); 
    for(i = 0; i < (faces ? faces->total : 0); i++){ 
     // Create a new rectangle for drawing the face 
     CvRect* r = (CvRect*)cvGetSeqElem(faces, i); 

     // Find the dimensions of the face,and scale it if necessary 
     pt1.x = r->x*scale; 
     pt2.x = (r->x+r->width)*scale; 
     pt1.y = r->y*scale; 
     pt2.y = (r->y+r->height)*scale; 

     // Draw the rectangle in the input image 
     cvRectangle(&frame, pt1, pt2, CV_RGB(255,0,0), 3); 
     } 
    cvShowImage(name, &frame); 
    return 0; 
} 

Mais, l'erreur suivante lorsque j'ai exécuté le programme compilé:

OpenCV Error: Null pointer() in cvClearMemStorage, file C:\builds\2_4_PackSlave-win32-vc12-shared\opencv\modules\core\src\datastructs.cpp 

plz me dire comment le réparer, si vous avez plus de temps, plz terminer le programme pour moi!

+0

Commencez par ne pas utiliser des variables globales. Répétez 471 fois: "Ce problème a été causé par mon utilisation de variables globales, ce que je ne ferai plus jamais." –

+0

Avez-vous manqué d'appeler 'cvCreateMemStorage' pour' storage' en premier? – P0W

+0

Désolé, la suggestion de POW a fait une autre erreur, mauvais drapeau (paramètre ou champ de structure) (type de tableau non reconnu ou non supporté) – Cro

Répondre

1

Utilisez la nouvelle API. De l'OpenCV 2.4 Documents sur CvMemStorage:

La section décrit API 1.x OpenCV pour la création de séquences cultivables et d'autres structures de données dynamiques attribuées en CvMemStorage. Si vous utilisez la nouvelle interface C++, Python, Java etc., vous aurez probablement besoin de cette fonctionnalité. Utilisez std :: vector ou d'autres structures de données de haut niveau

Cela dit, si vous voulez continuer à utiliser CvMemStorage, vous devez d'abord allouer de la mémoire à la structure. Selon les documents:

Un nouveau tampon de mémoire qui peut être allouée de façon explicite par MemStorageAlloc() fonction ou implicitement par des fonctions de niveau supérieur, tels que SeqPush(), GraphAddEdge() etc

Pour plus d'informations, voir http://docs.opencv.org/2.4/modules/core/doc/dynamic_structures.html

De même, lors de la création de la structure, vous devez transmettre un entier à cvCreateMemStorage. Encore une fois, docs:

CvMemStorage * cvCreateMemStorage (int block_size = 0) Paramètres: block_size - Taille des blocs de stockage en octets. S'il vaut 0, la taille du bloc est définie sur une valeur par défaut - actuellement il est d'environ 64K.

Cela pourrait ne être la cause de votre mauvaise erreur de paramètre

+0

Merci pour votre réponse! – Cro