【问题标题】:pass image data from python to cv::mat in c++在 C++ 中将图像数据从 python 传递到 cv::mat
【发布时间】:2019-01-20 21:32:30
【问题描述】:

我正在从我的 python 接口读取图像为cv2.imread("abc.tiff",1),我想将它传递给由 pybind11 绑定的 c++ 函数。 C++ 函数需要 cv::Mat 作为输入。

现在我了解到 python 将其转换为 NumPY ,一个 NxM 3D 数组

我发现数据高度、宽度、通道分别为 5504 8256 3。

任何帮助我如何找到它的解决方案。


同样,我需要将 cv::Mat 传递给 Python 接口

【问题讨论】:

  • AFAIK,没有标准的方法。你必须使用 cv::Mat 吗?例如,您可以在 C++ 而不是 python 中调用 cv::imread,只需将文件名字符串传递给 C++ 而不是矩阵。在返回端,您可以将 cv::Mat 作为数组返回,并在界面中从中构造一个 numpy ndarray。
  • 谢谢@mahesh; main req 将 cv::Mat 从 1 pybind11 接口传递到另一个接口。你能给我一些想法,我如何从 python 发送 numpy ndarray,并将其传输到 c++ 中的 cv::Mat
  • 您可以直接使用缓冲区。因此,将 numpy 数组重塑为向量,并将一维数组与维度一起传递给 C++ 接口。在 C++ 代码中,还使用从 python 传递的维度将一维数组转换为 cv::Mat。将过程反转到另一个方向(C++ 到 python)。您可能会发现这很有帮助:github.com/yati-sagade/opencv-ndarray-conversion/blob/master/…

标签: python numpy c++11 pybind11 opencv-mat


【解决方案1】:

对于python numpy -> c++ cv2,我找到了一种通过本机python扩展模块实现它的方法。

python3

image = cv.imread("someimage.jpg", 1)
dims = image.shape
image = image.ravel()
cppextenionmodule.np_to_mat(dims, image)

c++

static PyObject *np_to_mat(PyObject *self, PyObject *args){
    PyObject *size;
    PyArrayObject *image;

    if (!PyArg_ParseTuple(args, "O!O!", &PyTuple_Type, &size, &PyArray_Type, &image)) {
        return NULL;
    }
    int rows = PyLong_AsLong(PyTuple_GetItem(size ,0));
    int cols = PyLong_AsLong(PyTuple_GetItem(size ,1));
    int nchannels = PyLong_AsLong(PyTuple_GetItem(size ,2));
    char my_arr[rows * nchannels * cols];

    for(size_t length = 0; length<(rows * nchannels * cols); length++){
        my_arr[length] = (*(char *)PyArray_GETPTR1(image, length));
    }

    cv::Mat my_img = cv::Mat(cv::Size(cols, rows), CV_8UC3, &my_arr);

    ...
}

你可以查看 boost python wrapper 解决方案link

阅读更多关于扩展模块link

通过python扩展模块link阅读更多关于numpy的信息

【讨论】:

    猜你喜欢
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多