繁体   English   中英

如何从字节数组初始化RGBA cv :: Mat?

[英]How can I initialise an RGBA cv::Mat from a byte array?

我正在通过网络(从Python)发送图像,并希望在接收端(在C ++中)从它们创建OpenCV Mat

它们是这样创建的:

image = self.camera.capture_image()   # np.array of dtype np.uint8
h, w, c = image.shape   # 4 channels
image = np.transpose(image, (2, 0, 1)) # transpose because channels come first in OpenCV (?)
image = np.ascontiguousarray(image, dtype='>B')  # big-endian bytes
bytess = image.tobytes(order='C')

在此之后,我应该有一个数组,其中3个维度被展平,以便为每个通道将各个行附加在一起,然后附加通道以形成最终的字节缓冲区。 我已经证实我的理解是正确的,以下是有道理的

bytess[channel*height*width + i*wwidth + j] == image[channel, i, j]

[我认为上面的部分实际上并不重要,因为如果它不正确,我将得到一个错误显示的图像,但至少我会有一个图像,这比我现在更进一步。]

现在在另一边我试图这样做:

char* pixel_data = … // retrieve array of bytes from message
// assume height, width and channels are known
const int sizes[3] = {channels, width, height};
const size_t steps[3] = {(size_t)height * (size_t)width, (size_t)height};
cv::Mat image(3, sizes, CV_8UC1, pixel_data, steps);

所以,我创建了一个三维矩阵,其中元素类型是byte 我不确定我是否正确地确定了steps ,但我认为它与文档相符。

但运行这个只是崩溃了

error: (-5:Bad argument) Unknown array type in function 'cvarrToMat'

将RGBA(或BGRA for OpenCV)图像序列化为字节缓冲区并使用C ++ API从中创建cv::Mat的正确方法是什么?

我有一个解决方案,可以解决问题。 这一行在这里:

cv::Mat image(3, sizes, CV_8UC1, pixel_data, steps);

假设我可以通过单个字节传递三维的大小,但我无法使其工作。

而是使用不同的构造函数

cv::Mat image(height, width CV_8UC4, pixel_data);

我可以将图像视为二维,但使用vector-datatype(4字节元素大小而不是标量字节)。 如果pixel_data指针的布局正确,则pixel_data

正确的布局并没有明确记录,但可以从官方教程之一推断出来

在此输入图像描述

因此,存储数据使得一行接着另一行,并且行的每个元素被分成n_channels元素。 使用诸如CV_8UC4的数据类型使矩阵在原始数据阵列中的每个位置读取4个字节,并使指针前进4个字节。

所以在这种情况下,我只需要将numpy数组重新排列成适当的顺序:将行附加在一起,但交错通道。 我是这样做的,但我希望有一种没有循环的方法。

def array_to_cv_bytes(ary):
    assert ary.ndim == 3, 'Array must have 3 dimensions'
    h, w, c = ary.shape
    ary = ary[..., (2, 1, 0, 3)]
    output = np.empty(h * c * w, dtype=np.uint8)
    for channeld_idx in range(c):
        output[channeld_idx::c] = ary[..., channeld_idx].reshape(h*w)
    return output.tobytes(order='C')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM