我希望包装一个c ++类,它实现了我用Opencv 2.3编写的算法。我知道opencv作为一个整体有python包装器,但我需要的是包装我自己的使用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的转换代码,我必须注册它。
我觉得其他人必须在某个时候尝试过类似的东西,如果你能帮助我的话,我非常感激
重申目标:将使用opencv的c ++类包装到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。我尝试过很多不同的东西,但我无法让它发挥作用。
非常感谢帮助。