为使用Opencv 2.3的c ++类提升Python包装器

时间:2011-09-20 19:48:31

标签: python boost opencv wrapper boost-python

我正在尝试从使用opencv 2.3的类创建一个python库。我希望能够将numpy数组传递到类中,然后将它们转换为cv :: Mat的处理然后转换回numpy数组并返回。

这是一个简单的测试类,我正在努力让它在包装我自己的类之前工作。目前我只是尝试接收一个nvy数组音乐会到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 个答案:

答案 0 :(得分:1)

我认为这可能有点晚,但对于遇到同样问题的其他人可能会有用......

我认为您需要将新创建的库的路径添加到LD_LIBRARY_PATH,以便程序找到它。

假设当前目录'。'是您的库所在的位置,在运行程序之前在终端中键入以下内容:

export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH:。

注意:以上是临时出口是暂时的。您可能希望将lib复制到标准库路径(例如/ usr / local / lib),或者通过在.profile(或任何shell启动配置文件)中包含上述命令来永久添加路径。