15

我在python中使用opencv的har级联人脸检测器(cv.HaarDetectObjects)。

例如:

    faces = cv.HaarDetectObjects(grayscale, cascade, storage, 1.2, 2,
    cv.CV_HAAR_DO_CANNY_PRUNING, (50,50))

       for f in faces:
           print(f)

这将以这种形式打印检测列表:

 ((174, 54, 114, 114), 53)
 ((22, 51, 121, 121), 36)
 ((321, 56, 114, 114), 21)
 ((173, 263, 125, 125), 51)
 ((323, 272, 114, 114), 20)
 ((26, 271, 121, 121), 36)

每条线代表一次检测。前 4 个数字是左上角点的 x、y 位置,以及边界框的高度、宽度。最后一个数字是(引用 openCV 文档)邻居的数量。

我想我有两个问题:

1)最后一个数字是什么意思?谷歌搜索时我找不到任何参考。

2)(更重要)有没有办法为每个检测获得置信度分数?人脸分类器在多大程度上确定检测对应于真实人脸?

谢谢

4

2 回答 2

7

1) 检测代码对一个对象产生多个检测 - 例如以不同的比例、轻微偏移等。然后对检测进行分组,这样一组中的邻居数就是返回的数。另见 Viola Jones 论文第 5.6 段 ( http://research.microsoft.com/en-us/um/people/viola/Pubs/Detect/violaJones_IJCV.pdf ) 和 OpenCV 源代码。

2)您可以使用邻居的数量作为置信度的某种度量。

于 2011-10-31T09:31:39.877 回答
0

非常感谢您的提问和回答,我一直在寻找具有置信度分数的opencv人脸检测。您的问题和回答给了我一些解决问题的指导。

正如 Palmstrom 所说,最后一个数字表示该集群中的对象位置数。您可以将其用作置信度分数。

据我所知,旧的python API中只有这种API。新 API 没有这个(集群中的对象数)值。

我把我的代码放在这里以防它会帮助其他人。这是一个旧的 python API,它的教程很难找到。

import sys
import cv

def detect_face(image):
    image_size = cv.GetSize(image)
    # # create grayscale version
    grayscale = cv.CreateImage(image_size, 8, 1)
    cv.CvtColor(image, grayscale, cv.CV_BGR2GRAY)
    # # equalize histogram
    cv.EqualizeHist( grayscale,grayscale )

    #parameters to the detection function    
    cascade = cv.Load('haarcascade_frontalface_alt.xml')
    haar_scale = 1.1
    min_neighbors = 3
    haar_flags = cv.CV_HAAR_DO_CANNY_PRUNING
    min_size = (30,30)

    faces = cv.HaarDetectObjects(grayscale, cascade, cv.CreateMemStorage(0),
                                haar_scale, min_neighbors, haar_flags, min_size)

    print faces

    if len(faces) > 0:
        print '=> ' +  str(len(faces)) + ' face detected!'
        for ((x,y,width,height), n) in faces:
            pt1 = (x,y)
            pt2 = (x + width, y + height)
            cv.Rectangle(image, pt1, pt2, cv.RGB(255, 0, 0), 3, 8, 0) 


if __name__ == '__main__':

    filename = sys.argv[1]
    image = cv.LoadImage(filename,cv.CV_LOAD_IMAGE_COLOR);
    detect_face(image)

    cv.ShowImage("cam", image)
    cv.WaitKey(0)
于 2016-05-14T05:43:16.947 回答