10

由于速度慢,我使用 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

4 回答 4

23

需要注意的是,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);
}
于 2016-01-19T09:35:20.017 回答
7

cv::Rect这个想法是对的,但是你在访问's 元素时做错了。

它应该是:

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;
于 2016-01-19T08:29:15.770 回答
2

这个答案适用于 Python。
您可以使用 dlib 矩形向导的构造。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)

于 2020-02-05T11:39:08.183 回答
0

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

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

left = detections[0]
top = detections[1]
right = detections[2]
bottom = detections[3] 
dlibRect = dlib.rectangle(left, top, right, bottom) 

dlibRect 将是 dlib 类型的矩形。

于 2021-06-29T19:10:59.123 回答