如何在OpenCV中设置ROI,以便在视频输入中进行面部检测?

时间:2012-05-25 07:03:41

标签: opencv

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

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

3 个答案:

答案 0 :(得分:1)

然后,您可以先在已检测到的底面区域中限制嘴部级联搜索。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

至于如何在脸的下半部分创建投资回报率,请查看此tutorial(btw使用视频)和cv::detectMultiScale()功能。

如果您查看教程,您会看到他们创建了面部投资回报率:

Mat faceROI = frame_gray( faces[i] );

如果你看一下脸,你会发现它是一个std :: vector&lt; Rect&gt;,所以faces [i]是一个包含face_cascade.detectMultiScale(...)检测到的face的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);