Камера моего телефона отправляет изображение в формате YU12. который библиотека изначально не поддерживает. Я пытаюсь добавить его поддержку, преобразуя поток байтов из YU12 в YUYV.
Это функция, которая пытается выполнить преобразование:< /p>
Код: Выделить всё
pub fn yu12_to_yuyv(resolution: Resolution, data: &[u8]) -> Vec {
// Calculate the sizes of the Y, U, and V planes
let width = resolution.width_x as usize;
let height = resolution.height_y as usize;
let size = width * height;
let u_size = (width / 2) * (height / 2);
let v_size = u_size;
// Extract Y, U, and V planes from the input data
let y_plane = &data[0..size];
let u_plane = &data[size..(size + u_size)];
let v_plane = &data[(size + u_size)..(size + u_size + v_size)];
// Create a vector to hold the YUYV data
let mut yuyv = Vec::with_capacity(size * 2);
// Iterate over the image in 2x1 pixel blocks
for y in 0..height {
for x in (0..width).step_by(2) {
// Calculate positions in the Y, U, and V planes
let y_index1 = y * width + x;
let y_index2 = y * width + x + 1;
let uv_index = (y / 2) * (width / 2) + (x / 2);
// Read Y, U, and V values
let y1 = y_plane[y_index1];
let y2 = y_plane[y_index2];
let u = u_plane[uv_index];
let v = v_plane[uv_index];
// Append YUYV data (2 pixels)
yuyv.push(y1);
yuyv.push(u);
yuyv.push(y2);
yuyv.push(v);
}
}
yuyv
}

Конечно, это выглядит в основном правильно, за исключением того, что кажется шумом. Что здесь может быть не так, учитывая, что большая часть изображения выглядит нормально? Для более подробного контекста: ширина — 640, высота — 480, а длина данных — 462848. Отмечу, что длина данных немного странная, поскольку ожидается, что она будет равна 460800, как указано при запуске v4l2-ctl -d /dev/video0 --all, поэтому я Я не уверен, откуда берутся дополнительные 2048 байт. Я думал, что это может быть какое-то дополнение, но не уверен на 100%.
Подробнее здесь: https://stackoverflow.com/questions/784 ... oisy-image