web-dev-qa-db-ja.com

OpenCVのRectをdlibの長方形に変換しますか?

速度が遅いため、dlibの検出器ではなく、OpenCVの顔検出器とC++をdlibの顔の位置合わせに使用しています。
dlibの顔の位置合わせを使用するには、検出長方形を顔の位置合わせ関数に渡す必要があります。
しかし、dlibの検出器は問題ないのに、それはできません。
なぜならstd::vector<rectangle> detsdlibのサンプルコード で使用されています。以下に示すように割り当てようとしましたが、できませんでした。
ご了承ください 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;

何かアドバイスをいただけますか?

ありがとうございました。

10
univ_student

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);
}
19
lahjaton_j

考え方は正しいですが、 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;
5
herohuyongtao

この答えは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)を呼び出すことができます

0
Chandra Kanth