Создание оболочки Python для моего алгоритма, который использует Opencv 2.3 - PullRequest
5 голосов
/ 16 сентября 2011

Я хочу обернуть класс C ++, который реализует алгоритм, который я написал с использованием Opencv 2.3. Я знаю, что есть Python-обертки для opencv в целом, но мне нужно обернуть мой собственный код, который использует opencv. Это кажется логичным, потому что нижний уровень моего алгоритма будет быстро скомпилированным кодом C ++, и я буду свободен вызывать его из python и строить систему вокруг него.

Мой класс на самом деле довольно прост, у него есть 4 основных метода:

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

Это по сути большая часть того, что мне нужно обернуть. Проблема в том, что я не знаю, как лучше всего это сделать. Я изучил ctypes, swig, boost python и pyplusplus. На сегодняшний день мне не удалось ничего из перечисленного.

У меня постоянно возникают проблемы с переносом объекта opencv cv :: Mat. В Python я буду использовать массивы numpy, поэтому я знаю, что мне нужен код преобразования из массива numpy в cv :: Mat, и я должен его зарегистрировать.

Я чувствую, что кто-то, должно быть, однажды попробовал что-то подобное, если вы можете мне помочь, это очень ценится


Просто чтобы подтвердить цель: обернуть мой класс c ++, который использует opencv, в библиотеку python, чтобы я мог использовать свой алгоритм из python.

Я думаю, что преобразование несколько выяснено (с помощью исходного кода opencv), но я все равно не буду работать с python.

Хорошо, я работаю с кодом, указанным в приведенном выше сообщении (преобразование из numpy в cv :: Mat), и все еще сталкиваюсь с проблемами. Я собираюсь опубликовать свой код и, надеюсь, кто-то более знающий, чем я могу помочь мне здесь.

Например, вот простой класс:

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);
  }

И вот где я попытался обернуть этот класс, используя boost :: python и биты кода из приведенной выше ссылки:

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;
}

Функция numpy_to_mat из библиотеки pano_cv, но, поиграв с официальным исходным кодом opencv, я знаю, что эта функция также присутствует в некоторой степени. Полный файл имеет функцию ниже того, что я написал выше. Этот код компилируется с bjam просто отлично, но когда я импортирую в python, он вылетает. Ошибка заключается в следующем: libFoo.so: неопределенный символ: _ZN2cv3Mat10deallocateEv. Я пробовал несколько разных вещей, но я не могу заставить это работать.

Помощь наиболее ценится.

1 Ответ

1 голос
/ 16 сентября 2011

Я нашел некоторый код в Google, который преобразует массив numpy в cv :: mat в c ++, используя boost :: python: ссылка

...