4

我尝试使用ctypes将 C++ 中的 opencv3 cv::Mat图像转换为 python 中的Numpy数组。C++ 端是一个共享库,它从共享内存区域读取图像。共享内存正在工作,与这个问题无关。

extern "C" {
    unsigned char* read_data() {
        shd_mem_offset = region->get_address() + sizeof(sFrameHeader);
        unsigned char *frame_data = (unsigned char *) shd_mem_offset;
        return frame_data;
    }

    sFrameHeader *read_header() {
        sFrameHeader *frame_header;
        void *shd_mem_offset = region->get_address();
        frame_header = (sFrameHeader*)(shd_mem_offset);
        return frame_header;
    }

}

有两个函数声明为对 ctypes 可见。一种是返回 cv::Mat 属性,如colsrowsstep。另一个函数返回 cv::Mat 数据 (mat.data)。

python端看起来像这样:

import ctypes
import numpy as np
from numpy.ctypeslib import ndpointer


class sFrameHeader(ctypes.Structure):
    _fields_ = [
        ("frame_size", ctypes.c_size_t),
        ("frame_mat_rows", ctypes.c_int),
        ("frame_mat_cols", ctypes.c_int),
        ("frame_mat_type", ctypes.c_int),
        ("frame_mat_step", ctypes.c_size_t)]

Lib = ctypes.cdll.LoadLibrary('interface.so')
Lib.read_header.restype = ctypes.POINTER(sFrameHeader)
header = deepva_module_interface.read_header()
frame_size = header.contents.frame_size
frame_mat_rows = header.contents.frame_mat_rows
frame_mat_cols = header.contents.frame_mat_cols
frame_mat_step = header.contents.frame_mat_step
frame_mat_type = header.contents.frame_mat_type

Lib.read_data.restype = ndpointer(dtype=ctypes.c_char, shape=(frame_size,))
data = Lib.read_data()

我想在python中显示图像然后......

cv2.imshow('image', data)
cv2.waitKey(0)
cv2.destroyAllWindows()

..但我认为 numpy 数组的形状是错误的。如何正确构建 numpy 数组以便能够在 python 中将其用作 OpenCV 图像?

有没有将其转换为 numpy 的解决方案?这里有 boost::python 转换器。我将 Boost 用于共享内存,但希望将 ctypes 用于 C 绑定内容。

4

0 回答 0