C++ conversion from NumPy array to Mat (OpenCV)

前端 未结 3 363
礼貌的吻别
礼貌的吻别 2020-12-01 20:22

I am writing a thin wrapper around ArUco augmented reality library (which is based on OpenCV). An interface I am trying to build is very simple:

  • Python passes
3条回答
  •  醉梦人生
    2020-12-01 20:42

    Optionally, if you don't like to use wrappers, and want to use native python extension module, you can do it like this.

    python3:

    my_image = cv.imread("my_image.jpg", 1)  # reads colorfull image in python
    dims = my_image.shape  # get image shape (h, w, c)
    my_image = my_image.ravel()  # flattens 3d array into 1d
    cppextenionmodule.np_to_mat(dims, my_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);
    
        ... whatever with the image
    }
    

提交回复
热议问题