Попытка преобразования YU12 в YUYV привела к зашумленному изображению.Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Попытка преобразования YU12 в YUYV привела к зашумленному изображению.

Сообщение Anonymous »

Я пытаюсь использовать библиотеку Rust nokhwa для захвата изображений с помощью камеры телефона Android. Я подключил свой телефон Android через USB к ноутбуку и использую Droidcam, чтобы он работал в качестве веб-камеры.
Камера моего телефона отправляет изображение в формате 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»