C++ OpenCV-人脸检测:围绕人脸的矩形

C++ OpenCV-人脸检测:围绕人脸的矩形,c++,c,opencv,C++,C,Opencv,我从OpenCV开始,想测试一些样本。我使用的示例在屏幕中的面周围放置了一个矩形。但是最终的检测结果是不稳定的和零星的,我如何改进我的代码以使检测更平滑?我使用haarcascade_frontalface_alt.xml void detectAndDisplay( Mat frame ) { vector<Rect> faces; Mat frame_gray; cvtColor( frame, frame_gray, CV_BGR2GRAY ); equ

我从OpenCV开始,想测试一些样本。我使用的示例在屏幕中的面周围放置了一个矩形。但是最终的检测结果是不稳定的和零星的,我如何改进我的代码以使检测更平滑?我使用haarcascade_frontalface_alt.xml

void detectAndDisplay( Mat frame )
{
   vector<Rect> faces;
   Mat frame_gray;
   cvtColor( frame, frame_gray, CV_BGR2GRAY );
   equalizeHist( frame_gray, frame_gray );

   face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0, Size(40, 40) );
   for( size_t i = 0; i < faces.size(); i++ )
   {
      Mat faceROI = frame_gray( faces[i] );
      int x = faces[i].x;
      int y = faces[i].y;
      int h = y+faces[i].height;
      int w = x+faces[i].width;
      rectangle(frame,
          Point (x,y),
          Point (w,h),
          Scalar(255,0,255),
          2,
          8,
          0);
    }
imshow( "Capture - Face detection", frame );
}
void检测和显示(垫架)
{
向量面;
垫子框架为灰色;
CVT颜色(框架、框架灰、CV灰);
均衡器历史(帧灰,帧灰);
face_cascade.检测多尺度(frame_gray,faces,1.1,2,0,大小(40,40));
对于(size_t i=0;i
根据您的评论判断,您实际上是在视频序列的每一帧检测人脸,这是零星的,这就是您对结果不满意的地方。如果我错了,请纠正我


你在YouTube上看到的视频片段很可能是基于检测到的人脸进行跟踪的。通常在视频序列的第一帧中检测人脸,然后将其作为种子输入到跟踪算法中以跟踪人脸。OpenCV具有Mean Shift和Kalman Filter跟踪器等功能,可用于跟踪人脸。这些跟踪器的结果将比每一帧的检测结果更加平滑。

你所说的“它有点痉挛”是什么意思?代码是相当干净的,因为它是。步骤1)对图像进行预处理。步骤2)检测人脸。步骤3)围绕面绘制一个矩形。你不喜欢它的哪一部分?我在youtube上看过几段视频,它们的长方形在头上保持完美,我的有点神经质。我在每一帧中都能检测到人脸。我应该做的是:找到脸,记住脸,然后把它放在一个跟踪算法中,而不是在每一帧中找到它?是的。结果将更加平滑,通常计算效率更高。不过,跟踪是一个棘手(尚未解决)的问题,因此如果结果不完美,不要感到沮丧。