2011-09-16 16 views
5

Estoy buscando ajustar una clase C++ que implementa un algoritmo que escribí utilizando Opencv 2.3. Soy consciente de que hay wrappers de python para opencv en general, pero lo que necesito es ajustar mi propio código que usa opencv. Esto parece lógico porque el nivel inferior de mi algoritmo se compilará rápidamente en código C++ y podré llamarlo desde python y construir un sistema a su alrededor.Creación de un contenedor Python para mi algoritmo que usa Opencv 2.3

Mi clase es en realidad muy simple, tiene 4 métodos principales:

void train(std::vector<cv::Mat>); 
    void save(); 
    void load(); 
    bool detect(cv::Mat); 

Esta es esencialmente la mayoría de lo que necesito para envolver. El problema es que no sé cómo hacer esto mejor. He investigado ctypes, swig, boost python y pyplusplus. No he tenido éxito con ninguno de los anteriores hasta la fecha.

Sigo teniendo problemas con cómo envolver el objeto opencv cv :: Mat. Desde python voy a utilizar matrices numpy, así que sé que necesito el código de conversión de una matriz numpy a cv :: Mat y tengo que registrarlo.

me siento como otra persona debe haber intentado algo como esto en un momento dado, si usted me puede ayudar se aprecia mucho


Sólo para reiterar el objetivo: envolver mi clase de C++ que utiliza OpenCV en una biblioteca de Python para que pueda usar mi algoritmo de Python.

Creo que tengo la conversión algo descifrada (con la ayuda de la fuente opencv) pero todavía no funcionaré desde python.

Bien, he estado trabajando con el código vinculado en la publicación anterior (una conversión de numpy a cv :: Mat) y sigo teniendo problemas. Voy a publicar mi código y espero que alguien más informado que yo pueda ayudarme aquí.

Por ejemplo, aquí es una clase simple:

foo.h:

#include <opencv2/core/core.hpp> 

class Foo { 
    public: 
     Foo(); 
     ~Foo(); 

     cv::Mat image; 

     void bar(cv::Mat in); 
}; 

foo.cpp:

#include "foo.h" 

    Foo::Foo(){} 

    Foo::~Foo(){} 

    void Foo::bar(cv::Mat in) { 
     image = in; 
     cv::Canny(image, image, 50, 100); 
     cv::imwrite("image.png", image); 
    } 

Y aquí es donde he tratado de envolver el uso de esta clase boost :: python y bits de código del enlace de arriba:

wrap_foo.cpp

#include <boost/python.hpp> 
#include <numpy/arrayobject.h> 

#include <opencv2/core/core.hpp> 

#include "foo.h" 

using namespace cv; 
namespace bp = boost::python; 

//// Wrapper Functions 
void bar(Foo& f, bp::object np); 

//// Converter Functions 
cv::Mat convertNumpy2Mat(bp::object np); 

//// Wrapper Functions 
void bar(Foo& f, bp::object np) 
{ 
    Mat img = convertNumpy2Mat(np); 
    f.bar(img); 
    return; 
} 


//// Boost Python Class 
BOOST_PYTHON_MODULE(lib) 
{ 
    bp::class_<Foo>("Foo") 
     .def("bar", bar) 
     ; 
} 


//// Converters 
cv::Mat convertNumpy2Mat(bp::object np) 
{ 
    Mat m; 
    numpy_to_mat(np.ptr(),m); 
    return m; 
} 

La función numpy_to_mat es de la biblioteca pano_cv sino de jugar con la fuente oficial OpenCV sé que esta función también está allí en algún grado. El archivo completo tiene la función debajo de lo que escribí arriba. Este código se compila con bjam, pero cuando lo importo a python se bloquea. El error es este: libFoo.so: undefined symbol: _ZN2cv3Mat10deallocateEv. He intentado varias cosas diferentes pero no puedo hacer que esto funcione.

La ayuda es muy apreciada.

Respuesta

1

me encontré con algo de código de Google que convierte la gama numpy a cv :: estera en C++ usando impulso :: python: link

+0

Gracias! No he tenido la oportunidad de integrar esto con mi código pero parece exactamente lo que necesito. – Kevin

+1

El enlace no funciona ... –

+0

@Kevin ¿Pueden publicar un enlace actualizado? Este enlace no funciona –

Cuestiones relacionadas