0

正如我在上一个问题中提到的,我无法获得关于使用 Viola - Jones 算法检测面部特征的准确结果。尤其是在单独获取眼睛和嘴巴时,效果并不好。但是检测面部、眼睛和鼻子是没有问题的。所以我想到了一个简单的算法

  • 第 1 步:检测人脸
  • 第 2 步:检测眼睛配对
  • 第 3 步:在眼睛下方寻找鼻子
  • 第 4 步:寻找鼻子下方的嘴巴
  • 步骤 5:找到眼睛对的中点。在中点右侧和鼻子上方搜索左眼。
  • 第6步:对右眼做同样的事情。

在检测对象时,我使用cvHaarDetectObjects方法。但是使用这种方法似乎无法在所需像素之间搜索对象。那么是否有类似“获取此图像,并在 x 和 y 之间搜索鼻子,以及 x + 宽度和 y + 高度像素并给我鼻子的坐标”之类的功能。

任何帮助appriciated。

4

1 回答 1

0

我找到了答案。无需在所需像素之间进行搜索。Viola - Jones 算法已经以上述简单算法的方式找到了特征。因此,如果您按顺序搜索对象,它会毫无问题地找到面部特征。这是一个示例代码:

    void Detection::Detect()
{
    FacialFeatures* facialFeatures = new FacialFeatures();

    DrawRectangle(DetectFeature(faceDetector));
    DrawRectangle(DetectFeature(eyesDetector));
    DrawRectangle(DetectFeature(noseDetector));
    DrawRectangle(DetectFeature(mouthDetector));
    DrawRectangle(DetectFeature(leftEyeDetector));
    DrawRectangle(DetectFeature(righteyeDetector));
}

CvRect* Detection::DetectFeature(const char* detectorType)
{
    pCascade_ = (CvHaarClassifierCascade* ) cvLoad(detectorType,0,0,0);
    pRectSeq_ = cvHaarDetectObjects(pImage_, pCascade_, pStorage_, 1.1, 3, CV_HAAR_DO_CANNY_PRUNING, cvSize(20,20));
    CvRect* r = (CvRect*) cvGetSeqElem(pRectSeq_,0);
    return r;
}

void Detection::DrawRectangle(CvRect* r)
{
    cvNamedWindow("Detected", CV_WINDOW_AUTOSIZE);
    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);

    cvShowImage("Detected", pImage_);
    cvWaitKey(0);
}
于 2014-04-03T22:33:03.387 回答