使用Opencv 2.3的c++类的Boost Python包装器



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

下面是一个简单的测试类,在包装我自己的类之前,我正在做这个工作。目前,我只是试图接收一个numpy数组音乐会到cv::Mat,处理它,然后将其写入文件。在此工作之后,我将工作返回处理过的数组到python。

下面是一个简单的类:

foo:

#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。未定义符号:_ZN2cv3Mat10deallocateEv。我已经尝试了许多不同的事情,但我不能得到这个工作。

非常感谢您的帮助

我认为这可能有点晚了,但它可能对其他遇到同样问题的人有用…

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

假设当前目录'。'是你的库所在的位置,在运行程序之前在你的终端输入以下命令:

export LD_LIBRARY_PATH = LD_LIBRARY_PATH:美元。

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

最新更新