Discussion:
face detection (via Python bridge)
(too old to reply)
superchromix
2016-11-14 14:47:08 UTC
Permalink
hi,

I'm having some trouble using the IDL-Python bridge. I'm trying to run the face detection example from this blog post:

https://realpython.com/blog/python/face-recognition-with-python/

but my code is crashing at the point where it tries to detect the faces.

Here is the code:

pro test_python_face_detect

cv2 = Python.Import('cv2')

imagePath = 'C:\temp\FaceDetect\abba.png'
cascPath = 'C:\temp\FaceDetect\haarcascade_frontalface_default.xml'

; Create the haar cascade
faceCascade = cv2.CascadeClassifier(cascPath)

; Read the image
image = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

; Detect faces in the image

faces = faceCascade.detectMultiScale(gray,scaleFactor=1.1, $
minNeighbors=5,minSize=[30,30], $
flags = cv2.cv.CV_HAAR_SCALE_IMAGE)


end

The error I'm getting is:

% PYTHON_CALLMETHOD: Exception: Required argument 'rejectLevels' (pos 2) not found.

The code works fine when run from Python.

I think it's likely that there are multiple things going wrong with my code. One of them is that IDL is not recognizing that I'm calling the detectMultiScale method using another calling convention (there are two different ways of calling detectMultiScale, for some reason). See the docs here:

http://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.html?highlight=detectmultiscale#cv2.CascadeClassifier.detectMultiScale

Next, the IDL-Python bridge is not recognizing the keywords correctly, since the keywords are case sensitive.

What else? I don't know.

Does anyone have a suggestion on how to make this work? I would really like to be able to do face detection within IDL.

thanks
Mark
Dick Jackson
2016-11-14 16:31:45 UTC
Permalink
Hi Mark,

I've been working with some Python libraries, and when a colleague had a similar problem, she resorted to something like this (it's like using "Execute" in IDL… not optimal, perhaps, but it might do the job!):

Python.gray = gray
Python.scaleFactor = 1.1
Python.minNeighbors = 5
Python.minSize = [30,30]
Python.flags = cv2.cv.CV_HAAR_SCALE_IMAGE

void = Python.Run('faces = faceCascade.detectMultiScale(gray,scaleFactor=scaleFactor, minNeighbors=minNeighbors,minSize=minSize, flags=flags)')

faces = Python.faces


Does that work for you?

Cheers,
-Dick

Dick Jackson Software Consulting Inc.
Victoria, BC, Canada --- http://www.d-jackson.com
Post by superchromix
hi,
https://realpython.com/blog/python/face-recognition-with-python/
but my code is crashing at the point where it tries to detect the faces.
pro test_python_face_detect
cv2 = Python.Import('cv2')
imagePath = 'C:\temp\FaceDetect\abba.png'
cascPath = 'C:\temp\FaceDetect\haarcascade_frontalface_default.xml'
; Create the haar cascade
faceCascade = cv2.CascadeClassifier(cascPath)
; Read the image
image = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
; Detect faces in the image
faces = faceCascade.detectMultiScale(gray,scaleFactor=1.1, $
minNeighbors=5,minSize=[30,30], $
flags = cv2.cv.CV_HAAR_SCALE_IMAGE)
end
% PYTHON_CALLMETHOD: Exception: Required argument 'rejectLevels' (pos 2) not found.
The code works fine when run from Python.
http://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.html?highlight=detectmultiscale#cv2.CascadeClassifier.detectMultiScale
Next, the IDL-Python bridge is not recognizing the keywords correctly, since the keywords are case sensitive.
What else? I don't know.
Does anyone have a suggestion on how to make this work? I would really like to be able to do face detection within IDL.
thanks
Mark
superchromix
2016-11-14 19:21:13 UTC
Permalink
Thanks for the suggestion, but it's not working yet. It this fails at the Python.Run statement, because the faceCascade object is not defined on the Python side. When I tried to add

Python.faceCasecade = faceCascade

it still didn't work.

% PYTHON_RUN: Exception: name 'faceCascade' is not defined.
Dick Jackson
2016-11-14 23:45:30 UTC
Permalink
Post by superchromix
Thanks for the suggestion, but it's not working yet. It this fails at the Python.Run statement, because the faceCascade object is not defined on the Python side. When I tried to add
Python.faceCasecade = faceCascade
it still didn't work.
% PYTHON_RUN: Exception: name 'faceCascade' is not defined.
Sorry, Mark, I haven't actually installed the library and tried this, I'm tossing ideas off the top of my head…

Hmm, if that line is a direct quote, then it may be a typo (you have an extra "e" in the middle). That might fix it, or perhaps:

Python.gray = gray
Python.scaleFactor = 1.1
Python.minNeighbors = 5
Python.minSize = [30,30]
Python.flags = cv2.cv.CV_HAAR_SCALE_IMAGE

void = Python.Run('faces = cv2.CascadeClassifier.detectMultiScale(gray,scaleFactor=scaleFactor, minNeighbors=minNeighbors,minSize=minSize, flags=flags)')

faces = Python.faces

Of course, to try it more simply for now, how about:

Python.gray = gray

void = Python.Run('faces = cv2.CascadeClassifier.detectMultiScale(gray,scaleFactor=1.1, minNeighbors=5, minSize=[30,30], flags=cv2.cv.CV_HAAR_SCALE_IMAGE)')

faces = Python.faces

Is that any better?

Cheers,
-Dick

Dick Jackson Software Consulting Inc.
Victoria, BC, Canada --- http://www.d-jackson.com
k***@gmail.com
2017-12-21 01:57:47 UTC
Permalink
This post might be inappropriate. Click to display it.
l***@gmail.com
2017-08-09 18:31:19 UTC
Permalink
Hi, I think the problem is minSize=[30,30], that you are passing a list and somehow 2nd position is not found. I also have the same problem, let me know if you found any solution.
Loading...