我尝试使用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 属性,如cols、rows和step。另一个函数返回 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 绑定内容。