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