Beispiel #1
0
void WebCamData::trackFace() {
  CvConnectedComp comps;
  updateHugeImage(d->data);

  cvCalcBackProject(&d->hueImage, d->prob, d->histogram);
  cvAnd(d->prob, d->mask, d->prob, 0);
  CvBox2D box;
  cvCamShift(d->prob, d->faceRect,
             cvTermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1), &comps,
             &box);

  d->faceRect = comps.rect;

  int radius = cvRound((d->faceRect.width + d->faceRect.height) * 0.25);
  CvPoint center;
  center.x = cvRound(d->faceRect.x + d->faceRect.width * 0.5);
  center.y = cvRound(d->faceRect.y + d->faceRect.height * 0.5);
  /*
      qDebug() << Q_FUNC_INFO
      << comps.rect.x
      << comps.rect.y
      << comps.rect.width
      << comps.rect.height
      << box.angle
      << center.x
      << center.y
      << radius;
   */
  d->dataMap.clear();
  d->dataMap["z"] = QVariant(radius);
  d->dataMap["x"] = QVariant(center.x);
  d->dataMap["y"] = QVariant(center.y);
  d->dataMap["angle"] = QVariant(box.angle);
  Q_EMIT dataReady();
}
Beispiel #2
0
QRect WebCamData::detectFace(const char* faceData)
{

    if (d->hasFace) {
        trackFace();
        return QRect();
    }
    if (!d->mCascade) {
        qDebug() << Q_FUNC_INFO << ": " << "Error incorrect Haar classifier cascade";
        return QRect();
    }

    CvRect* rect = 0;
    int faceSize = d->data->width / 5;
    d->mFaceSeq = cvHaarDetectObjects(d->data,
                                      d->mCascade, d->mFaceStore, 1.1, 6,
                                      CV_HAAR_DO_CANNY_PRUNING,
                                      cvSize(faceSize, faceSize));
//   qDebug() << "Number of Faces Detected" << d->mFaceSeq->total;

    if (d->mFaceSeq && d->mFaceSeq->total) {
        rect = (CvRect*) cvGetSeqElem(d->mFaceSeq, 0);
        d->hasFace = true;

        int radius = cvRound((rect->width + rect->height) * 0.25);
        CvPoint center;
        center.x = cvRound(rect->x + rect->width * 0.5);
        center.y = cvRound(rect->y + rect->height * 0.5);

        //qDebug() << "Radius : " << radius << " X: " << center.x << "Y : " << center.y;
        //histogram

        float max = 0.f;
        float range[]  = {0, 180};
        float* ranges = range;
        int bins = 30;
        d->hsvImage = cvCreateImage(cvGetSize(d->data), 8, 3);
        d->hueImage = cvCreateImage(cvGetSize(d->data), 8, 1);
        d->mask = cvCreateImage(cvGetSize(d->data), 8, 1);
        d->prob = cvCreateImage(cvGetSize(d->data), 8, 1);
        d->histogram = cvCreateHist(1, &bins, CV_HIST_ARRAY, &ranges, 1);

        updateHugeImage(d->data);

        cvSetImageROI(d->hueImage, *rect);
        cvSetImageROI(d->mask, *rect);
        cvCalcHist(&d->hueImage, d->histogram, 0, d->mask);
        cvGetMinMaxHistValue(d->histogram, 0, &max, 0, 0);
        cvConvertScale(d->histogram->bins, d->histogram->bins, max ? 255.0 / max : 0, 0);
        cvResetImageROI(d->hueImage);
        cvResetImageROI(d->mask);

        d->faceRect = *rect;

        /*
                      */
    }


    return QRect();

}