我们在项目中使用 OpenCV,我们计划检测面部,然后使用创建的矩形作为我们的 ROI,然后检测那里的嘴巴。我们如何设置视频的投资回报率?我们搜索了如何,但只能找到静止图像的答案。我们想将我们的 ROI 设置为检测到的人脸的下 1/3 或下半部分。
使用了“haarcascade_mcs_mouth.xml”,但矩形放置在错误的位置。在右眉附近检测到嘴巴。
我们在项目中使用 OpenCV,我们计划检测面部,然后使用创建的矩形作为我们的 ROI,然后检测那里的嘴巴。我们如何设置视频的投资回报率?我们搜索了如何,但只能找到静止图像的答案。我们想将我们的 ROI 设置为检测到的人脸的下 1/3 或下半部分。
使用了“haarcascade_mcs_mouth.xml”,但矩形放置在错误的位置。在右眉附近检测到嘴巴。
然后,您可以首先将嘴部级联搜索限制在您已经检测到的底面区域。
对于图像和视频,过程是相同的。如果矩形在错误的位置,那么你可能在寻找与框架有关的嘴点时犯了错误。实际上
会给你坐标** 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);
}
您应该添加代码,因为这里的实际问题有点令人困惑。
为视频或图片设置 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);