如何使用Python和OpenCV获取detectMultiscale的置信度水平?

12
我正在使用训练好的OpenCV级联分类器在视频帧中检测手部,并想降低误报率。在网上查阅资料时,我看到可以通过访问detectMultiScale方法返回的rejectLevelslevelWeights信息来实现。我在这里看到,C++中可以实现这一点,我的问题是:有人成功在Python中实现了吗?一个类似的问题被问到这里,但是那是早期版本的检测方法。
如果可能,正确的语法是什么?如果您成功了,请提及您正在使用的OpenCV版本。我使用的是2.4.9版本。 2.4.11 API 给出以下语法。
Python: cv2.CascadeClassifier.detectMultiScale(image, rejectLevels, levelWeights[, scaleFactor[, minNeighbors[, flags[, minSize[, maxSize[, outputRejectLevels]]]]]]) 

因此,我尝试过

import cv2
import cv2.cv as cv
import time
hand_cascade = cv2.CascadeClassifier('cascade.xml')
img = cv2.imread('test.jpg')

rejectLevels = []
levelWeights = []
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = hand_cascade.detectMultiScale(gray,rejectLevels,levelWeights, 1.1, 5,cv.CV_HAAR_FIND_BIGGEST_OBJECT,(30, 30),(100,100),True)

但我得到的输出是

[[259 101  43  43]
 [354 217  43  43]
 [240 189  43  43]
 [316 182  47  47]
 [277 139  92  92]]
[]
[]

感谢您的帮助,

Ronen

2个回答

11

对于任何使用OpenCV 3.0的人来说,如果您在使用python API时遇到问题,请注意级联分类器上有三种方法:detectMultiScaledetectMultiScale2detectMultiScale3。使用第三种方法,我能够获得看起来像是置信度/权重的东西。

faces = faceCascade.detectMultiScale3(
    gray,
    scaleFactor=1.1,
    minNeighbors=5,
    minSize=(30, 30),
    flags = cv2.CASCADE_SCALE_IMAGE,
    outputRejectLevels = True
)
rects = faces[0]
neighbours = faces[1]
weights = faces[2]

weights[i] 看起来匹配了由 rects[i] 定义的人脸的置信度。 neighbours[i] 是当前矩形邻域中匹配数量。


detectMultiScale3 对我没用。detectMultiScale2 返回强度(或置信度)作为第二个变量。 - thecheech
对我来说,weights 是一个二维数组,所以 confidence = weights[i, 0] - mins

1
除了黑客攻击C++,看起来似乎没有任何方法可以获取实际的rejectLevels和levelWeights。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接