2012-11-23 49 views
0

我从OpenCV开始,想测试一些样本。我使用的示例在屏幕上的脸部周围放置了一个矩形。但是由此产生的检测结果是不稳定和零星的,我如何改进我的代码以使检测更平滑?我使用haarcascade_frontalface_alt.xml。OpenCV - 人脸检测:脸部周围的矩形

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); 
} 
+0

你是什么意思的“它有点痉挛”?代码很干净,因为它是。步骤1)预处理图像。步骤2)检测面部。步骤3)在面部周围绘制一个矩形。你不喜欢哪部分? – Chris

+0

我在YouTube上看过几个剪辑,他们的矩形在他们的头上保持完美,我的一个小小的跳跃。 – Haagenti

回答

1

通过您的评论来看,你实际上是在视频序列中的每一帧人脸检测,这是零星的,而这正是你不满意的结果。如我错了请纠正我。

您在YouTube上看到的剪辑可能基于检测到的脸部进行跟踪。在视频序列的第一帧中检测人脸是很常见的,然后将其用作跟踪算法中的种子输入来跟踪人脸。 OpenCV有many tracking algorithms,如Mean Shift和卡尔曼滤波器跟踪器,可以让你跟踪人脸。这些跟踪器的结果将比每帧的检测更加顺畅。

+0

我正在检测每个帧的面。我应该做的是:找到脸部,记住脸部,然后将其放入跟踪算法中,而不是在每个帧中找到它? – Haagenti

+0

是的。结果将更加平滑,通常计算效率更高。跟踪是一个艰难的(未解决的)问题,但是,如果结果不完美,请不要感到沮丧。 – Chris