Как искать объект между нужными пикселями?

Как я уже упоминал в мой предыдущий вопрос Я не могу получить точные результаты об обнаружении черт лица с помощью алгоритма Виолы — Джонса. Особенно при получении глаз в одиночку и рта, это не очень хорошо работает. Но нет проблем с распознаванием лица, пар глаз и носа. Так что я подумал о простой алгоритм который:

  • Шаг 1: Определить лицо
  • Шаг 2: Определить пару глаз
  • Шаг 3: Ищите нос под парой глаз
  • Шаг 4: Ищите рот ниже носа
  • Шаг 5: Найдите среднюю точку пары глаз. Поиск левого глаза на
    правая сторона средней точки и над носом.
  • Шаг 6: Сделайте то же самое для правого глаза.

При обнаружении предметов я использую cvHaarDetectObjects метод. Но с этим методом, похоже, невозможно найти объект между нужными пикселями. Так есть ли такая функция, как «Получите это изображение, и найдите нос между x и y, и x + ширина и y + высота пикселей и дайте мне координаты носа.«

Любая помощь ценится.

0

Решение

Я нашел ответ. Нет необходимости искать между нужными пикселями. Алгоритм Виолы — Джонса уже находит такие особенности, как простой алгоритм выше. Так что, если вы ищете объекты последовательно, он без проблем находит черты лица. Вот пример кода:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]