1

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

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

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

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


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

4

1 回答 1

3

对于python numpy -> c++ cv2我找到了一种方法,如何通过本机 python 扩展模块来做到这一点。

蟒蛇3

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 包装器解决方案链接

阅读更多关于扩展模块链接

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

于 2019-02-20T14:34:03.210 回答