【问题标题】:Boost Python wrapper for a c++ class that uses Opencv 2.3为使用 Opencv 2.3 的 c++ 类提升 Python 包装器
【发布时间】:2011-09-20 19:48:30
【问题描述】:

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

这是一个简单的测试类,我正在做这个测试,然后再包装我自己的类。目前我只是想接收一个 numpy 数组音乐会到一个 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。我尝试了许多不同的东西,但我无法让它发挥作用。

非常感谢您的帮助。

【问题讨论】:

  • 您正在将您的模块与正确版本的所有必要 opencv 库链接,对吗? (检查生成的共享库上的ldd / otool)。当 opencv 库移动时,我从 OpenCV 2.1 升级到 2.2 时遇到过这样的问题。

标签: python boost opencv wrapper boost-python


【解决方案1】:

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

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

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

导出 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:。

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

【讨论】:

    猜你喜欢
    • 2012-08-14
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多