【发布时间】:2016-05-06 13:14:17
【问题描述】:
使用 Python 3 和 OpenCV 3。
我用 C++ 编写了一些 DLL,它们导出了一些 C 类型函数和一个 uchar3 c 类型结构。我一直在 C++ 项目中将这些与 OpenCV 一起使用,但我也希望能够从 Python 访问它们。我对 Python 还很陌生,但我发现 ctypes 提供了一种相当直接的方式来使用 DLL。
我无法解决的是如何从 Python 中获取指向 OpenCV Mat 的指针。使用 C++,我执行以下操作:
myMatDataPointer = myMat.ptr<uchar>(0)
理想情况下,我想找到一种使用 uchar3 结构的简单方法,但我发现 ctypes 支持 char*如何让一个指向 Mat 的数据。
【问题讨论】:
-
您必须为库创建一个纯 C 接口。对于 C++,请尝试需要编译器的框架,例如 Cython、SWIG 或 Boost.Python。
-
是的,dll 的导出纯 C 函数(据我所知,无法从 dll 导出非纯 C 函数)。问题是这些函数需要一个指向 OpenCV mat 数据的指针。我知道如何在 C++ 中访问它,但在 Python 中不知道。
-
有 C++ DLL(例如微软的 ulib.dll,控制台程序使用的实用程序库),但由于没有跨平台、稳定的 ABI,因此一般来说不是一个好主意,而且这样的 DLL不能轻易与 ctypes 一起使用。在 Windows 上,C++ 开发人员通常会创建 COM DLL,您可以使用 comtypes 或 pythoncom。
-
关于获取指针,您可以编写一个返回指针的 C 存根函数。通常,这会调用 C++ 构造函数来获取 Python 代理类的
this实例。代理调用 C++ 方法的 C 包装器,手动提供this引用作为第一个参数。 -
在您建议的解决方案中是否暗示 OpenCV 没有像在 C++ 中那样提供通过 Python 直接访问 Mat 数据的任何方式?我真的希望有一种类似的简单方法来进行自定义图像处理。我不太明白你的建议,但听起来我可能更容易坚持使用 100% C++。
标签: python c++ opencv dll ctypes