如何在 OpenCV 中为视频源中的人脸和嘴部检测设置 ROI

  • 本文关键字:嘴部 设置 ROI OpenCV 视频 opencv
  • 更新时间 :
  • 英文 :


我们正在为我们的项目使用OpenCV,我们计划检测人脸,然后使用创建的矩形作为我们的ROI,然后检测那里的嘴巴。我们如何设置视频的投资回报率?我们搜索了方法,但只能找到静止图像的答案。我们希望将ROI设置为检测到的人脸的下半部分的1/3或下半部分。

使用了"haarcascade_mcs_mouth.xml",但矩形放置在错误的位置。在右眉附近检测到嘴巴。

然后,您可以首先将口腔级联搜索限制在已经检测到的底部面部区域。

对于图像和视频,过程是相同的。如果矩形在错误的位置,那么你可能在找到框架方面的口点时犯了错误。实际上
mouth_cascade.detectMultiScale(faces, mouth);会给你坐标** w.r.t脸**。因此,当您为嘴部坐标定义点时,必须确保添加面部坐标。前任。
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); }我希望我的观点是清楚的。

你应该添加你的代码,因为它有点令人困惑这里的实际问题是什么。

为视频或图片设置 ROI 没有区别,对于视频,您只需一个循环,其中垫帧不断更新。(我假设您使用的是C++ API,而不是C API)。

至于如何在脸部的下半部分创建ROI,请查看本教程(顺便说一句,它使用视频)和cv::d etectMultiScale()函数。

如果您查看教程,您会发现他们创建了面部投资回报率,如下所示:

Mat faceROI = frame_gray( faces[i] );

如果你看一下面孔,你会发现它是一个 std::vector,所以 faces[i] 是一个包含 face_cascade.detectMultiScale( ...) 检测到的人脸的 Rect。因此,与其直接使用该 Rect 创建 faceROI,不如使用仅包含下半部分的不同 Rect。看看cv::Rect是什么,你会发现它是由左上角的Rect.x和Rect.y坐标定义的,然后是Rect.width和Rect.height。因此,相应地创建投资回报率:

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);

最新更新