我尝试使用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绑定的东西。
你试过这个吗?
import cv2
import numpy as np
# construct cv_matrix here however you want to construct it.
np_matrix = np.asarray(cv_matrix)
cv2.imshow('image', data)
cv2.waitKey(0)
cv2.destroyAllWindows()