Обнаружение лица и сохранение обнаруженного лица в OpenCV - PullRequest
2 голосов
/ 16 февраля 2012

Я пытаюсь определить лицо на изображении и пытаюсь сохранить обнаруженное лицо как изображение в OpenCV.

Ниже приведены некоторые проблемы с функцией Detefaces.

#include "stdafx.h"

#include <stdio.h>
#include <cv.h>
#include <highgui.h>
#include <cxcore.h>

CvHaarClassifierCascade *cascade;
CvMemStorage            *storage;

void detectFaces( IplImage *img );

int _tmain(int argc, _TCHAR* argv[])
{
  //CvCapture *capture;
  IplImage  *img;//*out;
  int       key = 0;
  char      *filename = "C:/OpenCV2.1/data/haarcascades/haarcascade_frontalface_alt.xml";

  cascade = ( CvHaarClassifierCascade* )cvLoad( filename, 0, 0, 0 );
  storage = cvCreateMemStorage( 0 );
  img     = cvLoadImage("Yurico.png");

  assert( cascade && storage && img );

  cvNamedWindow( "video:", 1 );
  //cvNamedWindow( "video1:", 1 );
  //out = detectFaces( img );
  detectFaces( img );
  cvWaitKey( 0 );
  //cvShowImage( "video", out );
  cvDestroyWindow( "video:" );
  //cvDestroyWindow( "video1:" );
  cvReleaseImage( &img );
  cvReleaseHaarClassifierCascade( &cascade );
  cvReleaseMemStorage( &storage );

  return 0;
}

void detectFaces( IplImage *img )
{
    int i;
     CvRect *r;
    CvSeq *faces = cvHaarDetectObjects(
            img,
            cascade,
            storage,
            1.1,
            3,
            0 /*CV_HAAR_DO_CANNY_PRUNNING*/,
            cvSize( 40, 40) );

    for( i = 0 ; i < ( faces ? faces->total : 0 ) ; i++ ) {
        CvRect *r = ( CvRect* )cvGetSeqElem( faces, i );
        cvRectangle( img,
                     cvPoint( r->x, r->y ),
                     cvPoint( r->x + r->width, r->y + r->height ),
                     CV_RGB( 255, 0, 0 ), 1, 8, 0 );
    }

    //cvShowImage( "video:", img );
    cvSetImageROI(img, CvRect *r);

    IplImage *img2 = cvCreateImage(cvGetSize(img), 
                              img->depth, 
                               img->nChannels);

    cvSaveImage("Lakshmen.jpg",img2); 
}

Произошла ошибка, сказав это:

 Error  1   error C2664: 'cvSetImageROI' : cannot convert parameter 2 from 'CvRect *' to 'CvRect'   c:\users\hp\documents\visual studio 2010\projects\facedetect\facedetect\facedetect.cpp  67  1   facedetect

Хотите сохранить интересующую область в другое изображение. Любые исправления или улучшения, скажите мне ..

Ответы [ 3 ]

2 голосов
/ 16 февраля 2012

cvSetImageROI() принимает cvRect в качестве второго аргумента и использует его в качестве входного параметра для обрезки изображения в этой области.

Другими словами, вам нужно создать cvRect с действительной информацией. Вы можете сделать это перед вызовом функции или встроенным:

cvSetImageROI(img_corr, cvRect(x_pos, y_pos, width, height));

Я также заметил, что в вашем коде вы создаете CvRect* r; как минимум в 3 разных местах внутри одной и той же функции. Плохая практика! Совет: создавайте переменные в своем коде в тот момент, когда вы собираетесь их использовать, а не до этого.

2 голосов
/ 16 февраля 2012

вам нужно передать CvRect, а не CvRect *, поэтому вам не нужен указатель (*) до r. и так как это уже cvRect, вы должны просто написать:

 cvSetImageROI(img, &r);
0 голосов
/ 10 октября 2013

Просто замените CvRect *r на r=(CvRect*)cvGetSeqElem( faces,i) и после цикла for напишите две строки

cvSetImageROI(img, cvRect(r->x,r->y,r->width,r->height));
cvSaveImage("C1.jpg",img); 
...