我们在我们的项目中使用OpenCV,我们计划检测人脸,然后使用创建的矩形作为感兴趣区域,然后检测那里的嘴巴。我们如何设置视频的ROI?我们搜索了方法,但只能找到静止图像的答案。我们希望将ROI设置为检测到的人脸的下1/3或下半部分。
使用了"haarcascade_mcs_mouth.xml“,但矩形被放置在错误的位置。嘴巴是在右眉附近检测到的。
发布于 2012-05-25 15:40:36
然后,您可以首先将嘴部层叠搜索限制在已经检测到的底部面部区域。
发布于 2014-06-03 16:03:59
对于图片和视频,过程是相同的。如果矩形在错误的位置,那么你很可能在寻找与框架相关的口点时犯了错误。实际上是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); }
我希望我的观点是清楚的。
发布于 2012-05-25 16:40:18
您应该添加您的代码,因为它有点混淆这里的实际问题是什么。
在为视频或图片设置ROI方面没有区别,对于视频,您只需使用一个循环,其中Mat帧将不断更新。(我假设您使用的是C++应用程序接口,而不是C应用程序接口)。
至于如何在脸部的下半部分创建感兴趣区域,请看一下这个tutorial ( btw使用视频)和cv::detectMultiScale()函数。
如果你看一下教程,你会发现他们创建的面部ROI是这样的:
Mat faceROI = frame_gray( faces[i] );如果你观察faces,你会发现它是一个std::vector< Rect >,所以facesi是一个包含由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);https://stackoverflow.com/questions/10749948
复制相似问题