使用Python获取OpenCV中detectMultiscale的置信度?

Ron*_*nKi 10 python opencv viola-jones haar-classifier

我正在使用训练有素的opencv级联分类器来检测视频帧中的手,并希望降低我的误报率.在网上读了起来,我看见你可以通过访问这样做 rejectLevels,并levelWeights通过detectMultiScale方法返回的信息.我在这里看到这在C++中是可能的,我的问题是 - 有没有人设法用Python做到这一点?这里也提出一个类似的问题,但它是针对早期版本的检测方法.

如果可能,调用该方法的正确语法是什么?如果它适合您,请提及您正在使用的OpenCV版本.我在2.4.9.

2.4.11 API提供以下语法

Python: cv2.CascadeClassifier.detectMultiScale(image, rejectLevels, levelWeights[, scaleFactor[, minNeighbors[, flags[, minSize[, maxSize[, outputRejectLevels]]]]]]) 
Run Code Online (Sandbox Code Playgroud)

因此,我已经尝试过了

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)
Run Code Online (Sandbox Code Playgroud)

但我得到的输出是

[[259 101  43  43]
 [354 217  43  43]
 [240 189  43  43]
 [316 182  47  47]
 [277 139  92  92]]
[]
[]
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助,

罗南

fer*_*eel 8

对于任何人来到这个问题并使用OpenCV 3.0,我都在考虑了python API.

在级联分类有三种方法detectMultiScale,detectMultiScale2detectMultiScale3.使用第三个,我能够得到看起来像一个信心/重量.

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]
Run Code Online (Sandbox Code Playgroud)

weights[i]看起来与所定义的面部的置信度相匹配rects[i].neighbours[i]是当前矩形邻域中的匹配数.


Jar*_*yth 1

除了破解 C++ 之外,看起来没有任何方法可以获取实际的拒绝级别和级别权重。