Использование 'CvHaarClassifierCascade *' в программе facedetect с использованием opencv и eclipse

0

Я пытаюсь обнаружить лица, используя opencv2 в eclipse. Я использую следующую программу для того же...

#include <cv.h>
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/core/core.hpp"
#include"opencv2/imgproc/imgproc.hpp"
using namespace cv;
using namespace std;

CvRect detectFaceInImage(IplImage *inputImg, CvHaarClassifierCascade* cascade);
String face_cascade_name = "src/haarcascade_frontalface_alt.xml";
CvHaarClassifierCascade* cascade;

int main(int argc, const char* argv[])
{
     CvCapture* capture =0;

     capture = cvCaptureFromCAM(0);
     IplImage* inputImg=0;

    if( !cascade.load( face_cascade_name ) ){ printf("--(!)Error loading\n"); return   -1; };

while(true)
{
    inputImg = cvQueryFrame(capture);
    if(!inputImg) break;

    namedWindow("My_capture",CV_WINDOW_AUTOSIZE);

    CvRect outputImg;

    outputImg = detectFaceInImage(inputImg, cascade);
}

 return 0;
}
// Perform face detection on the input image, using the given Haar Cascade.
// Returns a rectangle for the detected region in the given image.
CvRect detectFaceInImage(IplImage *inputImg, CvHaarClassifierCascade* cascade)
{
    // Smallest face size.
    CvSize minFeatureSize = cvSize(20, 20);
    // Only search for 1 face.
    int flags = CV_HAAR_FIND_BIGGEST_OBJECT | CV_HAAR_DO_ROUGH_SEARCH;
    // How detailed should the search be.
    float search_scale_factor = 1.1f;
    IplImage *detectImg;
    IplImage *greyImg = 0;
    CvMemStorage* storage;
    CvRect rc;
    double t;
    CvSeq* rects;
    CvSize size;
    int ms, nFaces;
    storage = cvCreateMemStorage(0);
    cvClearMemStorage( storage );
    // If the image is color, use a greyscale copy of the image.
    detectImg = (IplImage*)inputImg;
    if (inputImg->nChannels > 1)
    {
        size = cvSize(inputImg->width, inputImg->height);
        greyImg = cvCreateImage(size, IPL_DEPTH_8U, 1 );
        cvCvtColor( inputImg, greyImg, CV_BGR2GRAY );
        detectImg = greyImg;    // Use the greyscale image.
    }

    // Detect all the faces in the greyscale image.
    t = (double)cvGetTickCount();
    rects = cvHaarDetectObjects( detectImg, cascade, storage,search_scale_factor, 3, flags, minFeatureSize);
    t = (double)cvGetTickCount() - t;
    ms = cvRound( t / ((double)cvGetTickFrequency() * 1000.0) );
    nFaces = rects->total;
    printf("Face Detection took %d ms and found %d objects\n", ms, nFaces);
        // Get the first detected face (the biggest).
    if (nFaces > 0)
        rc = *(CvRect*)cvGetSeqElem( rects, 0 );
    else
        rc = cvRect(-1,-1,-1,-1);   // Couldn't find the face.
        if (greyImg)
        cvReleaseImage( &greyImg );
        cvReleaseMemStorage( &storage );
        //cvReleaseHaarClassifierCascade( &cascade );
return rc;  // Return the biggest face found, or (-1,-1,-1,-1).
}

Но я получаю эту ошибку...

../src/test3.cpp:28:15: error: request for member 'load in 'cascade, which is of non-class type 'CvHaarClassifierCascade*

Я уже добавил "haarcascade_frontalface_alt.xml" в исходную папку. Когда я определяю каскад как CascadeClassifier, он показывает некоторую ошибку совместимости.

Я на самом деле новичок в opencv... так PLZ помочь

Теги:
opencv
face-detection

1 ответ

1
Лучший ответ

пожалуйста, не используйте устаревший c-api, он не будет поддерживаться в ближайшем будущем.

посмотрите здесь более современную версию

Кстати, если у вас есть указатель на что-то, вам нужно получить к нему доступ: something->, а не something.

  • 0
    эй, я могу сделать обнаружение лица с помощью программы, упомянутой в ссылке, уже предоставленной вами. Но я действительно хочу выяснить проблему с вышеупомянутой проблемой ... не могли бы вы уточнить, что вы хотите передать ... Я буду вам очень благодарен.
  • 0
    CvHaarClassifierCascade* cascade; if( !cascade->load( face_cascade_name ) ) вас есть указатель на CvHaarClassifierCascade, поэтому вы должны использовать -> вместо . , Кроме того, указатель никогда не создается, это должен был быть CvHaarClassifierCascade* cascade = createHaarClassifierCascade(); или похожий, я забыл. опять же, придерживайтесь нового, C ++ API и получайте удовольствие!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню