Повышение оболочки Python для класса C ++, который использует Opencv 2.3 - PullRequest
2 голосов
/ 20 сентября 2011

Я пытаюсь создать библиотеку python из класса, который использует opencv 2.3.Я хочу иметь возможность передавать массивы numpy в класс, где они будут преобразованы в обработанные cv :: Mat, затем преобразованы обратно в массивы numpy и возвращены.

Вот простой тестовый класс, над которым я работаю, чтобы получитьэто работает, прежде чем обернуть мой собственный класс.В настоящее время я просто пытаюсь получить концерт массива в cv :: Mat, обработать его и затем записать в файл.После того, как это сработает, я буду возвращать обработанный массив в python.

Вот простой класс:

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 (я использую код из исходного кода opencv для преобразования numpy в mat)

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 из источника opencv (modules / python / src2 / cv2.cpp).Полный файл имеет функцию ниже того, что я написал выше.Этот код прекрасно компилируется с bjam, но когда я импортирую в python, он вылетает.Ошибка заключается в следующем: libFoo.so: неопределенный символ: _ZN2cv3Mat10deallocateEv.Я пробовал несколько разных вещей, но я не могу заставить это работать.

Помощь очень ценится.

1 Ответ

1 голос
/ 15 августа 2012

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

Я думаю, вам нужно добавить путь к вновь созданной библиотеке в LD_LIBRARY_PATH, чтобы ваша программа могла его найти.

Предполагается, что текущий каталог '.' там, где находится ваша библиотека, перед запуском программы наберите в терминале следующее:

export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH :.

ПРИМЕЧАНИЕ: Выше временный экспорт является временным. Возможно, вы захотите скопировать свои библиотеки в стандартные пути к библиотекам, такие как / usr / local / lib, или добавить путь навсегда, включив указанную выше команду в свой .profile (или любой файл конфигурации запуска оболочки).

...