【问题标题】:Detecting a face and saving the detected face in OpenCV检测人脸并将检测到的人脸保存在 OpenCV 中
【发布时间】:2012-03-08 01:33:18
【问题描述】:

我正在尝试检测图像中的人脸并尝试将检测到的人脸保存为 OpenCV 中的图像。

下面的detectfaces函数有一些问题。

#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

想要将感兴趣区域保存到另一张图像中。任何更正或改进都会告诉我..

【问题讨论】:

    标签: c opencv image-processing computer-vision face-detection


    【解决方案1】:

    只需将 CvRect *r 替换为 r=(CvRect*)cvGetSeqElem( faces,i) 并在 for 循环之后写入两行

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

    【讨论】:

      【解决方案2】:

      cvSetImageROI() 将cvRect 作为第二个参数,并将其用作输入参数以将图像剪辑到该区域。

      换句话说,您需要使用有效信息创建cvRect。可以在调用函数之前做,也可以内联:

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

      我还注意到,在您的代码中,您在同一函数内的至少 3 个不同位置上创建了CvRect* r;。不好的做法!提示:在你将要使用它们的那一刻在你的代码中创建变量,而不是在那之前。

      【讨论】:

      • 如何将检测到的人脸区域与 cvSetImageROI 关联起来?
      【解决方案3】:

      你需要传递一个 CvRect 而不是一个 CvRect*,所以你不需要在 r 之前的指针 (*)。 因为它已经是一个 cvRect 你应该写:

       cvSetImageROI(img, &r);
      

      【讨论】:

      • 一个 cvRect 是这样创建的: CvRect rect = cvRect(25, 25, img2->width, img2->height);您只是将 cvSeq* 转换为 cvRect*。您需要了解人脸从哪里开始,这是矩形的第一个点,然后序列中的大小将是矩形的大小。错误仍然存​​在,而不是在 setROI 中
      • 尝试 CvRect r =CvRect (startingpoint.x, startingpoint.y, 40, 40);从您的代码中,脸部的大小似乎总是 40x40。现在我不知道您将面部所在矩形的起点存储在哪里(可能在“面部”中您拥有所需的所有值)
      猜你喜欢
      • 2021-01-22
      • 2016-01-01
      • 2012-02-04
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      • 2019-11-25
      • 2013-09-24
      相关资源
      最近更新 更多