将OpenCV的Rect转换为dlib的矩形?

时间:2016-01-19 08:24:08

标签: c++ opencv rect dlib

由于速度慢,我使用OpenCV的面部检测器和C ++进行dlib的面部对齐而不是dlib的检测器。
要使用dlib的面部对齐,我必须将检测矩形传递给面部对齐功能 但是,即使dlib的探测器没问题,我也不能这样做 由于在dlib's sample code中使用std::vector<rectangle> dets,我尝试分配如下所示,但我不能 请注意,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 个答案:

答案 0 :(得分:18)

必须注意的是,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);
}

答案 1 :(得分:4)

这个想法是对的,但你在访问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;

答案 2 :(得分:1)

此答案适用于Python。
您可以使用dlib矩形wiz的构造。 dlib.rectangle()。您可以使用OpenCV的面部边界框
x = face[0] y = face[1] w = face[2] h = face[3]
并将它们映射到dlib.rectangle(x, y, w, h)
然后,您可以调用预测变量代码shape = predictor(img, rect)

答案 3 :(得分:0)

在python中将OpenCV矩形坐标转换为DLIB矩形坐标:

如果检测是从 Opencv 获得的矩形坐标列表

SELECT * FROM Person 
WHERE PID IN (
    SELECT DISTINCT PID 
    FROM ACCOUNT 
    WHERE ANO IN (
        SELECT DISTINCT ANo 
        FROM DEPOSIT
        GROUP BY ANO,TDATE 
        Having Count(ANO)=3)
    );


PID     PName
"""""""""""""
 1      King
"""""""""""""

dlibRect 将是 dlib 类型的矩形。