C++ 我必须用我的数据库训练Viola-Jones算法才能获得准确的结果吗?

C++ 我必须用我的数据库训练Viola-Jones算法才能获得准确的结果吗?,c++,opencv,viola-jones,C++,Opencv,Viola Jones,我尝试提取人脸数据库的面部特征,但我发现Viola-Jones算法在两种情况下工作不好: 当我试图单独检测眼睛时 当我试着去检测嘴巴的时候 *工作不正常:检测图像的不同部分,如眼睛或嘴巴。或者有时检测到其中几个,这是不可能的情况。我使用的图像有纯绿色背景,包含一个人的正面 检测。cpp: #include "Detection.h" Detection::Detection(const char* imagePath, const char* detectorType) { pIm

我尝试提取人脸数据库的面部特征,但我发现Viola-Jones算法在两种情况下工作不好:

  • 当我试图单独检测眼睛时
  • 当我试着去检测嘴巴的时候
*工作不正常:检测图像的不同部分,如眼睛或嘴巴。或者有时检测到其中几个,这是不可能的情况。我使用的图像有纯绿色背景,包含一个人的正面

检测。cpp:

#include "Detection.h"

Detection::Detection(const char* imagePath, const char* detectorType)
{
    pImage_ = cvLoadImage(imagePath, CV_LOAD_IMAGE_COLOR);
    pStorage_ = cvCreateMemStorage(0);
    pCascade_ = (CvHaarClassifierCascade* ) cvLoad(detectorType,0,0,0);

    if(!pImage_ || !pStorage_ || !pCascade_)
    {
        std::cout << "Problem with Loading Image" << std::endl;
        exit(-1);
    }

    // Detect Faces in Image
    pFaceRectSeq_ = cvHaarDetectObjects(pImage_, pCascade_, pStorage_, 1.1, 3, CV_HAAR_DO_CANNY_PRUNING, cvSize(0,0));
    // Create a Window To Display Detected Faces
    cvNamedWindow("Detected", CV_WINDOW_AUTOSIZE);

    // Draw a Rectengular Outline Around Each Detection
    for(int i = 0; i < (pFaceRectSeq_ ? pFaceRectSeq_->total : 0); i++)
    {
        CvRect* r = (CvRect*) cvGetSeqElem(pFaceRectSeq_,0);
        CvPoint pt1 = { r->x, r->y };
        CvPoint pt2 = { r->x + r->width, r->y + r->height };
        cvRectangle(pImage_, pt1, pt2, CV_RGB(0,255,0), 3, 4, 0);
    }

    // r can be saved to a file/database as feature set

    cvShowImage("Detected", pImage_);
    cvWaitKey(0);
}

Detection::~Detection()
{
    cvDestroyWindow("Detected");
    cvReleaseImage(&pImage_);
    if(pCascade_) 
        cvReleaseHaarClassifierCascade(&pCascade_);
    if(pStorage_)
        cvReleaseMemStorage(&pStorage_);
}

void Detection::SaveFaceFeatures(char* fileName)
{

}
#include <iostream>
#include "Detection.h"

const char* imagePath           = "C:/1.jpg";
const char* faceDetector        = "C:/opencv/data/haarcascades/haarcascade_frontalface_default.xml";
const char* eyesDetector        = "C:/opencv/data/haarcascades/haarcascade_mcs_eyepair_big.xml";
const char* righteyeDetector    = "C:/opencv/data/haarcascades/haarcascade_mcs_righteye.xml";
const char* leftEyeDetector     = "C:/opencv/data/haarcascades/haarcascade_mcs_lefteye.xml";
const char* noseDetector        = "C:/opencv/data/haarcascades/haarcascade_mcs_nose.xml";
const char* mouthDetector       = "C:/opencv/data/haarcascades/haarcascade_mcs_mouth.xml";

int main(int argc, char* argv[])
{
    Detection *face     = new Detection(imagePath, faceDetector);
    //face->SaveFaceFeatures("01-1mFeatures.txt");
    Detection *eyes     = new Detection(imagePath, eyesDetector);
    //Detection *rightEye = new Detection(imagePath, righteyeDetector);
    //Detection *leftEye    = new Detection(imagePath, leftEyeDetector);
    Detection *nose     = new Detection(imagePath, noseDetector);
    //Detection *mouth  = new Detection(imagePath, mouthDetector);
    return 0;
}
#包括“Detection.h”
检测::检测(常量字符*图像路径,常量字符*检测类型)
{
pImage_uu=cvLoadImage(图像路径、CV_加载_图像_颜色);
pStorage_u=cvCreateMemStorage(0);
pCascade_u=(CvHaarClassifierCascade*)cvLoad(检测类型,0,0,0);
如果(!pImage|||!pStorage|||!pCascade|)
{
std::cout x,r->y};
CvPoint pt2={r->x+r->宽度,r->y+r->高度};
CV矩形(pImage_u,pt1,pt2,CV_RGB(0255,0),3,4,0);
}
//r可以作为功能集保存到文件/数据库中
cvShowImage(“已检测到”,pImage_);
cvWaitKey(0);
}
检测::~检测()
{
“检测到的”;
cvReleaseImage(&pImage_u2;);
如果(pCascade)
cvReleaseHaarClassifierCascade(&pCascade));
如果(pStorage_u2;)
cvReleaseMemStorage(存储和pStorage);
}
无效检测::SaveFaceFeatures(字符*文件名)
{
}
main.cpp:

#include "Detection.h"

Detection::Detection(const char* imagePath, const char* detectorType)
{
    pImage_ = cvLoadImage(imagePath, CV_LOAD_IMAGE_COLOR);
    pStorage_ = cvCreateMemStorage(0);
    pCascade_ = (CvHaarClassifierCascade* ) cvLoad(detectorType,0,0,0);

    if(!pImage_ || !pStorage_ || !pCascade_)
    {
        std::cout << "Problem with Loading Image" << std::endl;
        exit(-1);
    }

    // Detect Faces in Image
    pFaceRectSeq_ = cvHaarDetectObjects(pImage_, pCascade_, pStorage_, 1.1, 3, CV_HAAR_DO_CANNY_PRUNING, cvSize(0,0));
    // Create a Window To Display Detected Faces
    cvNamedWindow("Detected", CV_WINDOW_AUTOSIZE);

    // Draw a Rectengular Outline Around Each Detection
    for(int i = 0; i < (pFaceRectSeq_ ? pFaceRectSeq_->total : 0); i++)
    {
        CvRect* r = (CvRect*) cvGetSeqElem(pFaceRectSeq_,0);
        CvPoint pt1 = { r->x, r->y };
        CvPoint pt2 = { r->x + r->width, r->y + r->height };
        cvRectangle(pImage_, pt1, pt2, CV_RGB(0,255,0), 3, 4, 0);
    }

    // r can be saved to a file/database as feature set

    cvShowImage("Detected", pImage_);
    cvWaitKey(0);
}

Detection::~Detection()
{
    cvDestroyWindow("Detected");
    cvReleaseImage(&pImage_);
    if(pCascade_) 
        cvReleaseHaarClassifierCascade(&pCascade_);
    if(pStorage_)
        cvReleaseMemStorage(&pStorage_);
}

void Detection::SaveFaceFeatures(char* fileName)
{

}
#include <iostream>
#include "Detection.h"

const char* imagePath           = "C:/1.jpg";
const char* faceDetector        = "C:/opencv/data/haarcascades/haarcascade_frontalface_default.xml";
const char* eyesDetector        = "C:/opencv/data/haarcascades/haarcascade_mcs_eyepair_big.xml";
const char* righteyeDetector    = "C:/opencv/data/haarcascades/haarcascade_mcs_righteye.xml";
const char* leftEyeDetector     = "C:/opencv/data/haarcascades/haarcascade_mcs_lefteye.xml";
const char* noseDetector        = "C:/opencv/data/haarcascades/haarcascade_mcs_nose.xml";
const char* mouthDetector       = "C:/opencv/data/haarcascades/haarcascade_mcs_mouth.xml";

int main(int argc, char* argv[])
{
    Detection *face     = new Detection(imagePath, faceDetector);
    //face->SaveFaceFeatures("01-1mFeatures.txt");
    Detection *eyes     = new Detection(imagePath, eyesDetector);
    //Detection *rightEye = new Detection(imagePath, righteyeDetector);
    //Detection *leftEye    = new Detection(imagePath, leftEyeDetector);
    Detection *nose     = new Detection(imagePath, noseDetector);
    //Detection *mouth  = new Detection(imagePath, mouthDetector);
    return 0;
}
#包括
#包括“Detection.h”
const char*imagePath=“C:/1.jpg”;
const char*faceDetector=“C:/opencv/data/haarcascade/haarcascade\u frontalface\u default.xml”;
const char*eyesDetector=“C:/opencv/data/haarcascade/haarcascade\u mcs\u eyepair\u big.xml”;
const char*righteyeDetector=“C:/opencv/data/haarcascade/haarcascade\u mcs\u righteye.xml”;
const char*lefteydetector=“C:/opencv/data/haarcascade/haarcascade\u mcs\u lefteye.xml”;
const char*noseDetector=“C:/opencv/data/haarcascade/haarcascade\u mcs\u nose.xml”;
const char*moutdetector=“C:/opencv/data/haarcascade/haarcascade\u mcs\u mouth.xml”;
int main(int argc,char*argv[])
{
检测*面部=新检测(图像路径、面部检测器);
//面->SaveFaceFeatures(“01-1mFeatures.txt”);
检测*眼睛=新检测(图像路径、眼睛检测器);
//检测*rightEye=新检测(imagePath,righteyeDetector);
//检测*左眼=新检测(imagePath,leftEyeDetector);
检测*鼻=新检测(图像路径、鼻检测器);
//检测*嘴=新检测(图像路径,嘴检测器);
返回0;
}
我在用

  • 用于右眼检测的haarcascade\u mcs\u righteye.xml
  • 用于左眼检测的haarcascade\u mcs\u lefteye.xml
  • 用于口腔检测的haarcascade\u mcs\u mouth.xml

我必须用我的数据库训练算法吗?不训练算法就可以解决这个问题吗?如果不是,我如何使用AdaBoost对其进行训练?

最好在检测到的人脸区域中搜索眼睛(和其他人脸元素),而不是整个图像。您可以在opencv的文件夹中找到示例:

opencv\samples\cpp\tutorial\u code\objectDetection\


我建议你去看新的API。您使用的API已过时,将来将不受支持。

Viola-Jones算法不是一种可靠的方法。有时它会检测到,有时它不会,就是这样。但是,因为您使用的是正面人脸图像,所以不会有大的问题,因为这些分类器是针对正面人脸图像进行训练的。检测过程在很大程度上取决于图片的质量(不好的照明会导致问题)。

所以我不需要为每个不同的数据库训练算法?是的,您不需要为不同的数据库重新训练级联。