Python c++;使用Opencv 2.3的类

Python c++;使用Opencv 2.3的类,python,boost,opencv,wrapper,boost-python,Python,Boost,Opencv,Wrapper,Boost Python,我试图从一个使用opencv 2.3的类创建一个python库。我希望能够将numpy数组传递到类中,在类中它们将被转换为cv::Mat的处理,然后转换回numpy数组并返回 这是一个简单的测试类,在包装我自己的类之前,我正在使用它。目前,我正在尝试将numpy数组concert接收到cv::Mat,对其进行处理,然后将其写入文件。工作完成后,我将把处理后的数组返回给python 下面是一个简单的类: foo.h: #include <opencv2/core/core.hpp>

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

这是一个简单的测试类,在包装我自己的类之前,我正在使用它。目前,我正在尝试将numpy数组concert接收到cv::Mat,对其进行处理,然后将其写入文件。工作完成后,我将把处理后的数组返回给python

下面是一个简单的类:

foo.h:

#include <opencv2/core/core.hpp>

 class Foo {
    public:
        Foo();
        ~Foo();

        cv::Mat image;

        void bar( cv::Mat in );
}; 
这里是我尝试使用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;
}
#包括
#包括
#包括
#包括“foo.h”
使用名称空间cv;
名称空间bp=boost::python;
////包装函数
空心条(Foo&f,bp::对象np);
////转换器功能
cv::Mat ConvertNumpyMat(bp::object np);
////包装函数
空栏(Foo&f,bp::object np)
{
Mat img=convertNumpy2Mat(np);
f、 bar(img);
返回;
}
////boostpython类
BOOST_PYTHON_模块(lib)
{   
bp::类_uuo(“Foo”)
.def(“bar”,bar)
;
}
////转换器
cv::Mat ConvertNumpyMat(bp::object np)
{
matm;
numpy_to_mat(np.ptr(),m);
返回m;
}
numpy_to_mat函数来自opencv源代码(modules/python/src2/cv2.cpp)。完整的文件具有我上面写的功能。这段代码可以用bjam编译,但是当我导入python时,它崩溃了。错误是:libFoo.so:undefined symbol:_ZN2cv3Mat10deallocateEv。我尝试了很多不同的方法,但都无法成功


非常感谢您的帮助。

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

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

假设库所在的当前目录为“.”,请在运行程序之前在终端中键入以下内容:

导出LD\u库路径=$LD\u库路径:


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

您正在将模块链接到所有必要的正确版本的opencv库,对吗?(使用生成的共享库上的
ldd
/
otool
进行检查)。从OpenCV 2.1升级到2.2时,当OpenCV库移动时,我遇到过类似的问题。
#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;
}