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