if (roi.x >= 0 && roi.y >= 0 && roi.width > 0 && roi.height > 0 &&
(roi.x + roi.width) <= image.cols &&
(roi.y + roi.height) <= image.rows) {
-
intrestingRegion = intrestingRegion(roi);
roiIsUsed = true;
}
if (minSize.width > 0 && minSize.height > 0 &&
minSize.width <= image.cols && minSize.height <= image.rows) {
-
m_faceCascade.detectMultiScale(
intrestingRegion,
faceLocations,
minSize);
} else {
-
m_faceCascade.detectMultiScale(intrestingRegion, faceLocations);
}
{
if (!m_faceCascadeIsLoaded ||
m_haarcascadeFilepath != haarcascadeFilepath) {
-
if (!(m_faceCascadeIsLoaded = m_faceCascade.load(haarcascadeFilepath)))
return false;
trigger->__rectToDetect &= ALL_IMAGE_RECT;
/* 4. Perform Hog detector or try to track using movement regions */
if (trigger->__frameCounter % (trigger->__skipFramesCount + 1) == 0) {
-
trigger->__frameCounter = 0;
/* 4.1 Perform Hog detector */
gettimeofday(&time, NULL);
TrackedRectanglesIter trackRectIter = trigger->__trackedRects.begin();
for (; trackRectIter != trigger->__trackedRects.end(); ++trackRectIter) {
-
time_t currentLifetime = 1000000 *
(time.tv_sec - trackRectIter->appearanceTime.tv_sec) +
(time.tv_usec - trackRectIter->appearanceTime.tv_usec);
if (currentLifetime > PERSON_LIFETIME) {
-
trigger->__disappearedRects.push_back(trackRectIter->rect);
trackRectIter = trigger->__trackedRects.erase(trackRectIter);
}
/* 4.2 Try to track */
TrackedRectanglesIter iter = trigger->__trackedRects.begin();
while (iter != trigger->__trackedRects.end()) {
-
cv::Rect_<float> trackingResult;
if (iter->tracker.track(result->__grayImage, trackingResult))
iter->rect = supplementRectAfterTracking(trackingResult);
const size_t hogRectsSize = appearedPersons.size();
std::vector<bool> appearedBusyRects(hogRectsSize, false);
if (__trackedRects.size() > 0u && hogRectsSize > 0u) {
-
TrackedRectanglesIter trackRectIter = __trackedRects.begin();
std::vector<std::vector<size_t> > intersectionAreas(
__trackedRects.size(), std::vector<size_t>(hogRectsSize, 0u));
/* Merge tracked -> appearance */
for (size_t trIdx = 0u; trackRectIter != __trackedRects.end();
++trackRectIter, ++trIdx) {
-
size_t bestIdx = 0u;
bool haveRes = false;
for (size_t apIdx = 0u; apIdx < hogRectsSize; ++apIdx) {
-
intersectionAreas[trIdx][apIdx] =
(appearedPersons[apIdx] & trackRectIter->rect).area();
if (intersectionAreas[trIdx][apIdx] > 0 &&
(intersectionAreas[trIdx][apIdx] >
intersectionAreas[trIdx][bestIdx] || !haveRes)) {
-
bestIdx = apIdx;
haveRes = true;
}
/* Merge appearance -> tracked */
for (size_t apIdx = 0u; apIdx < hogRectsSize; ++apIdx) {
-
trackRectIter = __trackedRects.begin();
size_t bestIdx = 0u;
bool haveRes = false;
for (size_t trIdx = 0u; trackRectIter != __trackedRects.end();
++trackRectIter, ++trIdx) {
-
if (intersectionAreas[trIdx][apIdx] > 0 &&
(intersectionAreas[trIdx][apIdx] >
intersectionAreas[bestIdx][apIdx] || !haveRes)) {
-
bestIdx = trIdx;
bestTrackedRect = trackRectIter->rect;
haveRes = true;
trackRectIter = __trackedRects.begin();
for (size_t trIdx = 0u; trackRectIter != __trackedRects.end();
++trackRectIter, ++trIdx) {
-
bool haveRes = false;
size_t bestIdx = 0u;
for (size_t apIdx = 0u; apIdx < hogRectsSize; ++apIdx) {
if (!appearedBusyRects[apIdx] && (!haveRes ||
confidence[trIdx][apIdx] > confidence[trIdx][bestIdx])) {
-
bestIdx = apIdx;
haveRes = true;
}
if (isPossibleToMerge(trackRectIter->rect, appearedPersons[bestIdx]) &&
haveRes) {
-
appearedBusyRects[bestIdx] = true;
struct timeval time;