我尝试使用 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的解决方案? 有像here这样的boost :: python转换器。我使用Boost作为共享内存,但是希望保留ctypes用于C绑定。