gpt4 book ai didi

python - 如何使用ctypes(C++到Python)将opencv3 cv::Mat转换为numpy数组?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:24:37 28 4
gpt4 key购买 nike

我尝试通过使用cType将一个OpenCV3C::MAT图像转换成Python中的一个麻木数组。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;
}

}

有两个函数声明为ctype可见。一个是返回cv::mat属性,比如cols、rows和step。
返回cv::mat data(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转换器,比如 here。我使用boost来实现共享内存,但希望使用c绑定的cTypes。

最佳答案

请找到我的答案。您还可以找到其他答案here。用于转换numpy->cv::mat和cv::mat->numpy。

关于python - 如何使用ctypes(C++到Python)将opencv3 cv::Mat转换为numpy数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48831212/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com