2016-01-19 2 views
4

Я использую детектор лица OpenCV с C++ для выравнивания лица dlib вместо детектора dlib из-за медленной скорости.
Чтобы использовать выравнивание лица dlib, я должен передать прямоугольник обнаружения в функцию выравнивания лица.
Однако я не могу этого сделать, хотя детектор dlib в порядке.
Потому что std::vector<rectangle> dets используется в dlib's sample code, я попытался назначить, как показано ниже, но я не мог.
Обратите внимание, что detect_rect представляет собой прямоугольник обнаружения лица детектором OpenCV.
Преобразование прямоугольника OpenCV в прямоугольник dlib?

dets[0].l = detect_rect.left; 
dets[0].t = detect_rect.top; 
dets[0].r = detect_rect.right; 
dets[0].b = detect_rect.bottom; 

Не могли бы вы рассказать мне какие-либо советы?

спасибо.

+0

dlib использует .l .t .r .b? Можете ли вы объяснить, как их следует интерпретировать? Может быть, это расстояние от этих границ изображения (так что кавычки)? Если да, вам нужно будет использовать: .l = rect.x; '. .t = rect.y;'. .r = imageWidth - (rect.x + rect.width); '.b = imageHeight - (rect.y + rect.height); ' – Micka

+1

Длинный детектор лица не медленный. Вы уверены, что работаете в режиме выпуска? –

+0

Извините, я мог бы решить сам! Следующие коды работают! 'rectangle rect (слева, сверху, справа, внизу),' 'dets.push_back (rect);' Спасибо! –

ответ

3

Идея правильная, но вы неправы в доступе к элементам cv::Rect.

Оно должно быть:

dets[0].l = detect_rect.x; 
dets[0].t = detect_rect.y; 
dets[0].r = detect_rect.x + detect_rect.width; 
dets[0].b = detect_rect.y + detect_rect.height; 
+0

Благодарим вас за советы. Я мог бы решить сам! Следующие коды работают! 'rectangle rect (слева, сверху, справа, внизу),' 'dets.push_back (rect);' Спасибо! –

13

Это следует отметить, что OpenCV использует следующее определение:

OpenCV обычно предполагает, что верхний и левый границы прямоугольника включают, а - правая и нижняя границы не. определение

dlib включает в себя все границы, поэтому функция преобразования должна заботиться о сдвигая нижний правый угол на 1.

Вот функция, которая у меня есть в моем Utils.h

static cv::Rect dlibRectangleToOpenCV(dlib::rectangle r) 
{ 
    return cv::Rect(cv::Point2i(r.left(), r.top()), cv::Point2i(r.right() + 1, r.bottom() + 1)); 
} 

И наоборот:

static dlib::rectangle openCVRectToDlib(cv::Rect r) 
{ 
    return dlib::rectangle((long)r.tl().x, (long)r.tl().y, (long)r.br().x - 1, (long)r.br().y - 1); 
} 
+0

Спасибо за ваш совет. Я мог бы решить сам! Следующие коды работают! 'прямоугольник rect (левый, верхний, правый, нижний),' 'dets.push_back (rect);' Я думаю, что мои коды совпадают с вашим кодом. Спасибо за ваш ответ! –