10

速度が遅いため、dlibの検出器の代わりに、dlibの顔の位置合わせにOpenCVの顔検出器をC ++で使用します。
dlib の顔の位置合わせを使用するには、検出四角形を顔の位置合わせ関数に渡す必要があります。
ただし、dlib のディテクタは問題ありませんが、それはできません。はdlibのサンプルコード
で使われて いるので、以下のように割り当ててみましたが、できませんでした。OpenCVの検出器による顔検出長方形であることに 注意してください。std::vector<rectangle> dets
detect_rect

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アイデアは正しいですが、の要素へのアクセスが間違っています。

そのはず:

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 に答える