为我的算法创建一个使用Opencv 2.3的Python包装器

时间:2011-09-16 18:31:30

标签: python boost opencv wrapper swig

我希望包装一个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。我尝试过很多不同的东西,但我无法让它发挥作用。

非常感谢帮助。

1 个答案:

答案 0 :(得分:1)

我在google上发现了一些使用boost :: python将numpy数组转换为cv :: mat的c ++代码: link