Создание оболочки Python для моего алгоритма, использующего Opencv 2.3

Я хочу обернуть класс С++, который реализует алгоритм, который я написал с использованием 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), и я все еще сталкиваюсь с проблемами. Я собираюсь опубликовать свой код и, надеюсь, кто-то более знающий, чем я, сможет мне помочь.

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

фу.ч :

#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. Я пробовал несколько разных вещей, но я не могу заставить это работать.

Помощь приветствуется.


person Kevin    schedule 16.09.2011    source источник


Ответы (1)


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

person Fábio Diniz    schedule 16.09.2011
comment
Спасибо! У меня не было возможности интегрировать это с моим кодом, но похоже, что это именно то, что мне нужно. - person Kevin; 19.09.2011
comment
@Kevin Не могли бы вы опубликовать обновленную ссылку? Эта ссылка не работает - person Punit Vara; 07.08.2017
comment
Я не был моей ссылкой :( у меня тоже 404s. - person Kevin; 08.08.2017