From f70e3796fe6f11b9af4ce5f148ec9cb91321970b Mon Sep 17 00:00:00 2001
From: Andre Anjos <andre.anjos@idiap.ch>
Date: Fri, 21 Sep 2012 09:18:12 +0200
Subject: [PATCH] Final fixes to landmark detector

---
 flandmark/ext/ext.cpp | 25 ++++++++++---------------
 1 file changed, 10 insertions(+), 15 deletions(-)

diff --git a/flandmark/ext/ext.cpp b/flandmark/ext/ext.cpp
index 55380e1..81eb808 100644
--- a/flandmark/ext/ext.cpp
+++ b/flandmark/ext/ext.cpp
@@ -8,6 +8,7 @@
 #include <boost/shared_ptr.hpp>
 #include <boost/shared_array.hpp>
 #include <boost/python.hpp>
+#include <bob/core/python/gil.h>
 #include <bob/core/python/ndarray.h>
 #include <cv.h>
 
@@ -28,6 +29,7 @@ static void delete_image(IplImage* i) {
 }
 
 static void delete_storage(CvMemStorage* s) {
+  cvClearMemStorage(s);
   cvReleaseMemStorage(&s);
 }
 
@@ -46,8 +48,8 @@ class Localizer {
     Localizer(const std::string& opencv_cascade,
         const std::string& flandmark_model) : 
       m_cascade((CvHaarClassifierCascade*)cvLoad(opencv_cascade.c_str(), 0, 0, 0), std::ptr_fun(delete_cascade)),
-      m_flandmark(flandmark_init(flandmark_model.c_str()), std::ptr_fun(delete_flandmark))//,
-      //m_storage(cvCreateMemStorage(0), std::ptr_fun(delete_storage))
+      m_flandmark(flandmark_init(flandmark_model.c_str()), std::ptr_fun(delete_flandmark)),
+      m_storage(cvCreateMemStorage(0), std::ptr_fun(delete_storage))
     {
       if( !m_cascade ) {
         PYTHON_ERROR(RuntimeError, "Couldnt load Face detector '%s'", opencv_cascade.c_str());
@@ -64,8 +66,6 @@ class Localizer {
      * Locates the landmarks from an input image
      */
     tuple operator() (bob::python::const_ndarray input) {
-      //bob::python::no_gil unlock;
-
       //checks type
       const bob::core::array::typeinfo& type = input.type();
       if ((type.dtype != bob::core::array::t_uint8) || (type.nd != 2)) {
@@ -74,22 +74,17 @@ class Localizer {
 
       //converts to IplImage
       const blitz::Array<uint8_t, 2> bz = input.bz<uint8_t,2>();
-      boost::shared_ptr<IplImage> ipl_image(cvCreateImage(cvSize(type.shape[1],
-              type.shape[0]), IPL_DEPTH_8U, 1), std::ptr_fun(delete_image));
-      char* saved_ipl_data = ipl_image->imageData;
-      ipl_image->imageData = (char*)bz.data(); //replace
-    
+      boost::shared_ptr<IplImage> ipl_image(cvCreateImageHeader(cvSize(type.shape[1], type.shape[0]), IPL_DEPTH_8U, 1), std::ptr_fun(delete_image));
+      ipl_image->imageData = (char*)bz.data();
+
       // Flags for OpenCV face detection
       CvSize minFeatureSize = cvSize(40, 40);
       int flags =  CV_HAAR_DO_CANNY_PRUNING;
       float search_scale_factor = 1.1f;
 
       // Detect all the faces in the greyscale image.
-      boost::shared_ptr<CvMemStorage> m_storage(cvCreateMemStorage(0), 
-          std::ptr_fun(delete_storage));
-      cvClearMemStorage(m_storage.get());
       CvSeq* rects = cvHaarDetectObjects(ipl_image.get(), m_cascade.get(),
-          m_storage.get(), search_scale_factor, 2, flags, minFeatureSize);
+            m_storage.get(), search_scale_factor, 2, flags, minFeatureSize);
       int nFaces = rects->total;
 
       list retval;
@@ -116,7 +111,7 @@ class Localizer {
         retval.append(det);
       }
 
-      ipl_image->imageData = saved_ipl_data;
+      ipl_image->imageData = 0;
 
       return tuple(retval);
 
@@ -126,7 +121,7 @@ class Localizer {
 
     boost::shared_ptr<CvHaarClassifierCascade> m_cascade;
     boost::shared_ptr<FLANDMARK_Model> m_flandmark;
-    //boost::shared_ptr<CvMemStorage> m_storage;
+    boost::shared_ptr<CvMemStorage> m_storage;
     boost::shared_array<float> m_landmarks;
 
 };
-- 
GitLab