为使用OpenCV 2.3的C++类制作Boost Python封装

2 投票
1 回答
930 浏览
提问于 2025-04-17 02:43

我正在尝试创建一个Python库,这个库是基于一个使用opencv 2.3的类。我希望能够将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: undefined symbol: _ZN2cv3Mat10deallocateEv。我尝试了很多不同的方法,但就是无法解决这个问题。

非常感谢任何帮助。

1 个回答

1

我觉得这个回答可能来得有点晚,但对遇到同样问题的人来说可能会有帮助...

你需要把新创建的库的路径添加到你的LD_LIBRARY_PATH里,这样你的程序才能找到它。

假设你当前的目录就是库所在的地方,也就是'.',在运行程序之前,你可以在终端里输入以下命令:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

注意:上面的命令只是临时的。你可能想把你的库复制到一些标准的库路径,比如/usr/local/lib,或者通过把上面的命令放到你的.profile文件(或者其他的启动配置文件)里来永久添加这个路径。

撰写回答