簡體   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