Конвертировать OpenCV Rect в прямоугольник dlib?

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

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

Не могли бы вы дать мне совет?

Спасибо.

4

Решение

Следует отметить, что 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);
}
17

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

Идея верна, но вы делаете неправильно при доступе 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;
3

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