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