【问题标题】:Python OpenCV pass mat ptr to c++ codePython OpenCV 将 mat ptr 传递给 c++ 代码
【发布时间】: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


【解决方案1】:

我刚刚意识到这个问题从未得到解答。我现在可以提供一个我一直在使用的。它支持使用纯 C 接口进行双向通信。

import cv2
import ctypes
import numpy as np
import numpy.ctypeslib as npct

# Tell numpy what kind of pointer we want to use, load the dll
ucharPtr = npct.ndpointer(dtype=np.uint8, ndim=1, flags='CONTIGUOUS')
dll = ctypes.WinDLL('file.dll')

# the 'process_frame' function exported by the dll reads from
# the first pointer and writes to the second
process = dll['process_frame']
process.restype = None
process.argtypes = [ucharPtr, ucharPtr]

# Make two empty images for demonstration purposes
# OpenCV Python uses numpy arrays images, not Mat's
# This makes it super easy to work with images in python
in_image = np.zeros(shape,np.uint8,order='C').ravel()
out_image = np.zeros(self.shape,np.uint8,order='C').ravel()
process(in_image, out_image)

我当然可以为 in_image 使用更有趣的东西,但是我们已经成功地将图像从 OpenCV python 发送到 dll,并且可以使用我们的 dll 返回的任何东西。

【讨论】:

  • 谢谢,++ 方面是什么?如何将指针加载到 opencv Mat 中?
  • 我实际上并没有在 C++ 代码中使用 opencv,而是使用低级 CUDA 代码在 GPU 上进行快速处理。也就是说,如果你有一个带有正确元数据的 Mat,那么带有 OpenCV C++ 的 IIRC,你可以将它的指针更改为你的数据所在的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
相关资源
最近更新 更多