【问题标题】:Expose OpenCV C++ Mat to Python将 OpenCV C++ Mat 暴露给 Python
【发布时间】:2018-12-12 16:30:22
【问题描述】:

大家好,基本上我有以下内容

下面的 test.cpp

cv::Mat load(string filename){

Mat img = imread(filename,CV_LOAD_IMAGE_COLOR);
GpuMat cudaMat;
cudaMat.upload(img);
cuda::DeviceInfo deviceinfo;
cout << "GPU: "<< deviceinfo.cuda::DeviceInfo::name() << endl;   
imshow("opencvtest_load",img);
waitKey(0);
return img;
}

我用 boost 包装如下:

#include<boost/python.hpp>
using namespace boost::python;
BOOST_PYTHON_MODULE(opencvtest)
{
def("load",load);
}

我用make命令生成所有东西,从python代码test.py调用

image = "some directory and image"
from opencvtest import load
img3 = load(image)

所以,实际上我现在需要的是从要处理的加载方法中获取 Mat 转换为 python。

当时我有以下错误: TypeError:没有找到适用于 C++ 类型的 to_python(按值)转换器:
简历::垫

所以我已经完成了所有库解决方案,因为它们总是会出错。有没有更好的解决方案。提前非常感谢

【问题讨论】:

  • 我可能会因此而大发雷霆,但你使用 Modern C 并且你想降级到 python?这就像拥有一辆奥迪或梅赛德斯并用 T-Ford 取代它......
  • 事实上,我需要的所有库都已经在 python 中了>
  • 请详细说明:如果你想要速度,为什么要首先使用python? python 是一种解释性语言,因此如果你想要速度,这不是一个明智的选择

标签: python c++ boost


【解决方案1】:

长话短说:为了在 C++ 类中使用 Boost,您还需要向 Python 公开 C++ 方法。

Python 的内存管理策略与 C++ 非常不同,因此为了让两者都管理一个对象,您需要将 C++ 类包装在 Python 友好的包装器中。 Boost 具有促进这一点的功能,尽管我还没有确切地检查过如何做到这一点,而且 Boost 的文档对于 Python 库来说并不令人惊奇。查看this part of Boost's python documentation 了解如何操作。

如果您想在 C++ 和 Python 中使用 OpenCV,它比听起来要复杂一些。尽管 OpenCV 同时具有 C++ 和 Python 绑定,但 Python 绑定都使用 NumPy,而 C++ 绑定使用诸如cv::Mat 之类的类。为了一起使用它们,您必须处理与这些格式之间的转换。

但是,这种转换可以更简单一些,因为 Boost 还具有 NumPy 数组绑定(这意味着转换可以完全在 C++ 中处理)。我发现this 的代码可以帮助我处理相当混乱的转换,并发现即使是高清图像,转换的开销也很小(因为它主要是memcpy)。

关于“如果你有 C++ 可用,为什么要使用 Python”的评论——C++ 的开发时间可能会很慢,尤其是在处理图像处理时。 Python 可能很慢,但开发时间可以快得多。如果您编写了可运行的 Python 代码并希望加快它的速度,那么将它的一部分转换为 C++ 比开始完全重写它更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    相关资源
    最近更新 更多