如何在所需像素之间搜索对象



正如我在上一个问题中提到的,我无法获得有关使用 Viola - Jones 算法检测面部特征的准确结果。特别是在单独获得眼睛和嘴巴时,效果不佳。但是检测面部,眼睛和鼻子没有问题。因此我想到了一个简单的算法,即:

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

在检测对象时,我使用cvHaarDetectObjects方法。但是使用这种方法,看起来不可能在所需像素之间搜索对象。那么是否有一些功能,例如"获取此图像,并在x和y之间搜索鼻子,x +宽度和y +高度像素,然后给我鼻子的坐标。

任何帮助都得到了认可。

我找到了答案。没有必要在所需的像素之间进行搜索。中提琴 - 琼斯算法已经像上面的简单算法一样找到了特征。因此,如果您按顺序搜索对象,它会毫无问题地找到面部特征。下面是一个示例代码:

    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);
}

相关内容

  • 没有找到相关文章

最新更新