How to load haar classifier for face detection from within application

343 views
Skip to first unread message

Andrew Russell

unread,
Jul 1, 2011, 10:54:56 AM7/1/11
to javacv
Hello, back again for more advice...

In my face detection class I've been happily declaring my cascade file
thus
private static final String CASCADE_FILE =
"C:\\OpenCV2.2\\data\\haarcascades\
\haarcascade_frontalface_alt2.xml";

Now I want to push my web app to a unix server so this path will be
invalid. How do I ensure the path to the classifer is valid regardless
of the OS it's running on? ie that this declaration works whether
running on Windows or Solaris:

private static final String CASCADE_FILE =
"haarcascade_frontalface_alt.xml";

I've tried identifying the path to the classifier (currently sat in my
src folder) like this:
String pathToCascadeFile = request.getContextPath() + "/WEB-INF/
classes/" +CASCADE_FILE;

and passing this to the face detection method but I get this stack
trace:

java.lang.RuntimeException: ..\..\..\..\ocv\opencv\modules\objdetect
\src\haar.cpp:1013: error: (-27) Invalid classifier cascade

at
com.googlecode.javacv.cpp.opencv_objdetect.cvHaarDetectObjects(Native
Method)
at
com.googlecode.javacv.cpp.opencv_objdetect.cvHaarDetectObjects(opencv_objdetect.java:
237)
at
uk.ac.sheffield.cics.uploadImage.util.FaceChecker.faceChecker(FaceChecker.java:
88)
at
uk.ac.sheffield.cics.uploadImage.controller.UploadImageController.upload(UploadImageController.java:
77)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:
710)
at
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:
167)
at
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:
414)
at
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:
402)
at
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:
771)
at
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:
716)
at
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:
647)
at
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:
563)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
269)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:
188)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:
204)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:
172)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:
127)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:
117)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:
108)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:
174)
at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:
875)
at org.apache.coyote.http11.Http11BaseProtocol
$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:
665)
at
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:
528)
at
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:
81)
at org.apache.tomcat.util.threads.ThreadPool
$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Thread.java:595)

I could always store the classifiers on the application server but I
would prefer to reference them from within the application.

Thanks in advance!

Andrew

Samuel Audet

unread,
Jul 1, 2011, 8:59:49 PM7/1/11
to jav...@googlegroups.com
Hello,

The problem is similar on Android. Just put it in Java resources, and
extract it in a tmp directory at runtime. Check the FacePreview.java
sample for some code that does that:
http://code.google.com/p/javacv/source/browse/trunk/javacv/samples/FacePreview.java#109

Samuel

Reply all
Reply to author
Forward
0 new messages