Я отправляю изображения по сети (из Python) и хочу создать OpenCV Mat
s из них на принимающей стороне (в C ++).
Они созданы так:
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
, но думаю, что он соответствует документации 1018 *.
Но выполнение этого просто вылетает с
error: (-5:Bad argument) Unknown array type in function 'cvarrToMat'
Как правильно сериализовать изображение RGBA (или BGRA для OpenCV) в байтовый буфер и создать из него cv::Mat
с помощью API C ++?