python - 使用 Python 在 OpenCV 中获得 detectMultiscale 的置信度?

标签 python opencv haar-classifier viola-jones

我正在使用训练有素的 opencv 级联分类器来检测视频帧中的手,并希望降低误报率。 在网上阅读,我看到你可以通过访问 detectMultiScale 方法返回的 rejectLevelslevelWeights 信息。我看到了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]]
[]
[]

感谢您的帮助,

罗南

最佳答案

对于任何遇到这个问题并使用 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] 是当前矩形邻域内的匹配数。

关于python - 使用 Python 在 OpenCV 中获得 detectMultiscale 的置信度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28998792/

相关文章:

python - 在Python中查找圆函数和中心

linux - 使用多个正图像进行 Haar Cascade 训练

python - 如何在 Scrapy/Twisted 中使用线程,即如何在响应回调中对阻塞代码进行异步调用?

python - 如何使用python将值插入xml变量

python - 两个字符字典的最大相似度?

opencv - 如何进行肤色匹配

python - 对 __init__.py 和导入感到困惑

java - 为什么gradle会出错?

opencv - 使用opencv和树莓相机模块进行人脸检测的最佳算法是什么

python - 如何更改opencv检测到的刻度的形状