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

问题描述 投票:4回答:1

我尝试使用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绑定的东西。

python c++ numpy ctypes opencv-mat
1个回答
0
投票

你试过这个吗?

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()
© www.soinside.com 2019 - 2024. All rights reserved.