# python facedetection detectMultiScale

The function cv2.detectMultiScale can successfully detect the position of face and by using the fuction cv2.detectMultiScale3 i can also know the confidence score of each detected face.

My question is the fuction cv2.detectMultiScale3 only tells confidence scores of the search windows of detected faces,and my thought is when i slowly move the search window,it can tell me the socres for every window(even if they are very small) but not only the detected faces window.

in this program i simply cut 1 image to several parts(using the cv2.ROI)

import os
import cv2
from PIL import Image,ImageDraw

image_save_path_tail = ".jpg"

for i in range(1,49):

if img.ndim == 3:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
else:
gray = img

rects = faces[0]
neighbours = faces[1]
weights = faces[2]
print("weight of %d is "%(i),rects,neighbours,weights)


and i get

weight of 1 is () () () weight of 2 is () () () weight of 3 is () () () weight of 4 is () () () weight of 5 is () () () weight of 6 is () () () weight of 7 is () () () weight of 8 is () () () weight of 9 is () () () weight of 10 is () () () weight of 11 is () () () weight of 12 is () () () weight of 13 is () () () weight of 14 is () () () weight of 15 is () () () weight of 16 is () () () weight of 17 is () () () weight of 18 is () () () weight of 19 is () () () weight of 20 is () () () weight of 21 is () () () weight of 22 is () () () weight of 23 is () () () weight of 24 is () () () weight of 25 is () () () weight of 26 is () () () weight of 27 is () () () weight of 28 is () () () weight of 29 is () () () weight of 30 is () () () weight of 31 is () () () weight of 32 is () () () weight of 33 is () () () weight of 34 is () () () weight of 35 is () () () weight of 36 is () () () weight of 37 is () () () weight of 38 is () () () weight of 39 is () () () weight of 40 is () () () weight of 41 is () () () weight of 42 is () () () weight of 43 is () () () weight of 44 is () () () weight of 45 is () () () weight of 46 is [[ 4 10 37 37]] [[25]] [[ 7.2749402]] weight of 47 is () () () weight of 48 is [[ 0 13 32 32]] [[25]] [[ 8.64948004]]

edit retag close merge delete

I will rephrase code for you.

import os
import cv2
from PIL import Image,ImageDraw

image_save_path_tail = ".jpg"

for i in range(1,49):
if img.ndim == 3:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
else:
gray = img

rects = faces[0]
neighbours = faces[1]
weights = faces[2]
print("weight of %d

( 2017-12-04 12:54:48 -0500 )edit

As above code.. This is not the right way. You can't put inside for looping block condition imread, cvColor and detectMultiScale3. I haven't attempted detectMultiScale3 yet.

( 2017-12-04 13:00:00 -0500 )edit
1

@supra56 Why exactly can't he/she put imread, cvtColor and detectMultiScale in a for loop? I have done this multiple times with no problems whatsoever.

( 2017-12-05 14:29:30 -0500 )edit

the code only stores weights if you succeed in passing the window throughout the complete cascade. If not it leaves it initialized. So if you want this behaviour, you will have to break open the existing code and find a case specific solution.... if you do attempt this, keep me posted, since i am interested in this behaviour as well.

( 2017-12-06 04:43:12 -0500 )edit

@eshirima: This is what he/she getting this......weight of 1 is () () () weight of 2 is () () () weight of 3 is () () () weight of 4 is () () () weight of 5 is () () () weight of 6 is () () () weight of 7 is () () () weight of 8 is () () () weight of 9 is () () ()

( 2017-12-06 07:27:04 -0500 )edit
1

@supra56 Pardon my ignorance but I still do not understand where you are going with this. How does OP getting that output having anything to do with him/her not putting imread,cvtColor and detectMultiScale in a for loop?

( 2017-12-06 08:49:46 -0500 )edit

@eshirima you are correct in the fact that @supra56 is just plain wrong

( 2017-12-06 12:20:44 -0500 )edit

@StevenPuttemans. If I'm wrong, I will withdrawn my comment

( 2017-12-07 05:47:49 -0500 )edit

Sort by » oldest newest most voted

You needed unpack for detectMultiScale3 in order to get for x,y,w,h in faces: to get it working.

faces, w, n = face_cascade.detectMultiScale3(gray, scaleFactor=1.3,
minNeighbors=5,
minSize=(100, 100),
outputRejectLevels=True)
print(f'w :', w)
print(f'n :', n)

more

Official site

GitHub

Wiki

Documentation