OpenCV中detectMultiScale的参数使用Python

Posted

技术标签:

【中文标题】OpenCV中detectMultiScale的参数使用Python【英文标题】:Parameters of detectMultiScale in OpenCV using Python 【发布时间】:2016-07-13 02:49:31 【问题描述】:

我无法理解传递给 detectMultiScale 的参数。我知道一般语法是 detectMultiScale(image, rejectLevels, levelWeights) 但是,参数rejectLevels 和levelWeights 是什么意思呢?用于检测物体的最佳值是多少?

我想用它来检测瞳孔

【问题讨论】:

你的参数很不对。 【参考方案1】:

detectMultiScale 函数用于检测人脸。此函数将返回一个矩形,其坐标为 (x,y,w,h) 围绕检测到的人脸。

它需要 3 个常用参数——输入图像、scaleFactor 和 minNeighbours。

scaleFactor 指定每个比例缩小图像大小。在合影中,可能有一些人脸比其他人更靠近相机。自然,这样的面孔会比背后的面孔显得更加突出。这个因素弥补了这一点。

minNeighbours 指定每个候选矩形应该有多少个邻居来保留它。您可以在此处详细了解它。您可能必须调整这些值以获得最佳结果。此参数指定一个矩形应该被称为一个面的邻居数。

我们在特定范围内进行跟踪和测试后获得这些值。

【讨论】:

【参考方案2】:

OpenCV Class List docs 提供了所有 C++ 和 Python 方法的描述。

这是cv::CascadeClassifier detectMultiScale:

检测多尺度

Python

objects = cv.CascadeClassifier.detectMultiScale(image[, scaleFactor[, minNeighbors[, flags[, minSize[, maxSize]]]]]

参数

image            Matrix of the type CV_8U containing an image where objects
                 are detected.  

objects          Vector of rectangles where each rectangle contains the  
                 detected object, the rectangles may be partially outside  
                 the original image.  

scaleFactor      Parameter specifying how much the image size is reduced 
                 at each image scale.  

minNeighbors     Parameter specifying how many neighbors each candidate  
                 rectangle should have to retain it.

flags            Parameter with the same meaning for an old cascade as in  
                 the function cvHaarDetectObjects. It is not used for a  
                 new cascade.

minSize          Minimum possible object size. Objects smaller than that  
                 are ignored.  

maxSize          Maximum possible object size. Objects larger than that  
                 are ignored. If maxSize == minSize model is evaluated  
                 on single scale.

注意

(Python) 使用级联分类器的人脸检测示例可以在 opencv_source_code/samples/python/facedetect.py 找到

如前所述,OpenCV source code 提供了一个示例用法。您可以将每个记录的参数作为关键字传递。

rects = cascade.detectMultiScale(img, 
                                 scaleFactor=1.3, 
                                 minNeighbors=4, 
                                 minSize=(30, 30),
                                 flags=cv.CASCADE_SCALE_IMAGE)

【讨论】:

【参考方案3】:

在这些参数中,需要多注意其中的四个:

scaleFactor – 指定在每个图像比例下图像尺寸缩小多少的参数。

基本上,比例因子用于创建比例金字塔。更多解释,您的模型在训练期间定义了固定大小,在 XML 中可见。这意味着如果存在,则在图像中检测到该大小的面部。但是,通过重新缩放输入图像,您可以将较大的人脸调整为较小的人脸,使其可被算法检测到。

1.05 是一个很好的可能值,这意味着您使用一个小步来调整大小,即将大小减小 5%,您增加了找到与模型匹配大小以进行检测的机会。这也意味着该算法工作得更慢,因为它更彻底。您可以将其提高到 1.4 以加快检测速度,但可能会完全丢失一些人脸。

minNeighbors – 指定每个候选矩形应保留多少邻居的参数。

此参数会影响检测到的人脸质量。值越高,检测越少,但质量越高。 3~6 是个不错的选择。

minSize – 最小可能的对象大小。小于该值的对象将被忽略。

此参数确定您要检测的尺寸。你来决定!通常,[30, 30] 是人脸检测的良好开端。

maxSize – 最大可能的对象大小。大于此的对象将被忽略。

此参数确定您要检测的大小。再一次,你决定!通常不需要手动设置,默认值假设你要检测的人脸大小没有上限。

【讨论】:

我想指出你应该为minSize而不是[30,30]指定一个元组(30,30)。因此,示例用法为faces = face_cascade.detectMultiScale(image=gray, scaleFactor=25, minNeighbors=50, minSize=(30,30))【参考方案4】:

可以在此处找到代码示例: http://docs.opencv.org/3.1.0/d7/d8b/tutorial_py_face_detection.html#gsc.tab=0

关于参数说明,你可能引用了旧的参数定义,实际上你可能会遇到以下参数:

scaleFactor:指定图像尺寸缩小多少的参数 在每个图像比例。 minNeighbors:指定每个候选矩形应保留多少个邻居的参数

在这里你可以找到关于这些参数的很好的解释: http://www.bogotobogo.com/python/OpenCV_Python/python_opencv3_Image_Object_Detection_Face_Detection_Haar_Cascade_Classifiers.php

确保为面部和眼睛获得适当的预训练分类器集,例如

haarcascade_frontalface_default.xml haarcascade_eye.xml

【讨论】:

以上是关于OpenCV中detectMultiScale的参数使用Python的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 错误:调用 detectMultiScale 时断言失败

OpenCV predict() 与 detectMultiScale()

OpenCV人脸识别--detectMultiScale函数

OpenCV:如何将 HOGDescriptor::detectMultiScale() 与自定义 SVM 一起使用?

opencv detectMultiScale()

opencv:foundWeights 在虚拟 void detectMultiScale(..) 中是啥意思