0

私たちのプロジェクトでは OpenCV を使用しており、顔を検出し、作成した四角形を ROI として使用して、そこで口を検出する予定です。動画の ROI をどのように設定しますか? 方法を検索しましたが、静止画の回答しか見つかりませんでした。ROI を検出された顔の下 1/3 または下半分に設定したいと考えています。

「haarcascade_mcs_mouth.xml」が使用されていますが、長方形が間違った場所に配置されています。口は右眉の近くに検出されます。

4

3 に答える 3

1

次に、最初に、既に検出した下面領域で口のカスケード検索を制限できます。

于 2012-05-25T07:40:36.303 に答える
1

画像とビデオの場合、プロセスは同じです。また、長方形が間違った場所にある場合は、フレームに関して口のポイントを見つけるのに間違いを犯している可能性があります. 実際 に座標 ** wrt face** を提供します。したがって、口の座標のポイントを定義する場合は、顔の座標を追加する必要があります。元。 私の見解が明確であることを願っています。mouth_cascade.detectMultiScale(faces, mouth);
mouth_cascade.detectMultiScale(faces[j], mouth); for( size_t i=0; i < mouth.size(); i+++ { Point pt1( faces[j].x + mouth[i].x, faces[j].y + mouth[i].y); Point pt2( pt1.x + mouth[i].width, pt1.y + mouth[i].height); rectangle( frame, pt2, pt1, cvScalar(0, 0, 0, 255), 1, 8, 0); }

于 2014-06-03T08:03:59.287 に答える
0

ここで実際の問題が何であるかが少しわかりにくいので、コードを追加する必要があります。

ビデオまたは写真の ROI の設定に違いはありません。ビデオの場合、Mat フレームが継続的に更新される単純なループになります。(C API ではなく C++ API を使用していると仮定しています)。

顔の下半分に ROI を作成する方法については、このチュートリアル(動画を使用) とcv::detectMultiScale()関数をご覧ください。

チュートリアルを見ると、顔の ROI が次のように作成されていることがわかります。

Mat faceROI = frame_gray( faces[i] );

顔を見ると、それが std::vector< Rect > であることがわかります。したがって、faces[i] は face_cascade.detectMultiScale( ... ) によって検出された顔を含む Rect です。したがって、その Rect を使用して faceROI を直接作成する代わりに、下半分のみを含む別の Rect を使用します。cv::Rectとは何かを見てみましょう。左上隅の Rect.x 座標と Rect.y 座標によって定義され、Rect.width と Rect.height によって定義されていることがわかります。したがって、それに応じて ROI を作成します。

Rect tmp = faces[i]; //the Rect you want is the same as the original Rect
tmp.y = faces[i].y+faces[i].height/2; //except that it starts from half the face downwards (note that in image coordinates, origin is the topleft corner, and y increases downwards.
Mat faceROI = frame_gray(tmp);
于 2012-05-25T08:40:17.787 に答える