gpt4 book ai didi

python - 为使用 Opencv 2.3 的 c++ 类 boost Python 包装器

转载 作者:太空宇宙 更新时间:2023-11-03 21:48:20 24 4
gpt4 key购买 nike

我正在尝试从一个使用 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: undefined symbol: _ZN2cv3Mat10deallocateEv。我尝试了很多不同的东西,但我无法让它工作。

非常感谢您的帮助。

最佳答案

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

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

假设当前目录'.'是你的图书馆所在的地方,在运行你的程序之前在你的终端中输入以下内容:

导出 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

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

关于python - 为使用 Opencv 2.3 的 c++ 类 boost Python 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7490932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com