我使用经过训练的opencv级联分类器来检测视频帧中的手,并希望降低我的误报率。
在网上阅读,我看到你可以访问网页
detectMultiScale方法返回的rejectLevels
和levelWeights
信息。我看到here这在C ++中是可能的,我的问题是 - 有没有人设法在Python中做到这一点?一个类似的问题被问到here,但它是针对早期版本的检测方法。
如果可能,调用该方法的正确语法是什么?如果它适合您,请提及您正在使用的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]]
[]
[]
感谢您的帮助,
罗南
答案 0 :(得分:8)
对于任何人来到这个问题并使用OpenCV 3.0,我都是在探索python API之后找到的。
在级联分类器上有三种方法detectMultiScale
,detectMultiScale2
和detectMultiScale3
。使用第三个,我能够得到看起来像一个信心/重量。
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]
是当前矩形附近的匹配数。
答案 1 :(得分:1)
没有黑客攻击c ++,看起来没有办法获得实际的rejectLevels和levelWeights。