Значение QVideoFrame :: planeCount () и QVideoFrame :: bytesPerLine - PullRequest
0 голосов
/ 04 ноября 2018

QVideoFrame :: planeCount

Возвращает количество самолетов в видеокадре. Это значение только действителен при отображении данных кадра

QVideoFrame :: BytesPerLine

Возвращает количество байтов в строке сканирования.

Я не очень хорошо понимаю эти утверждения, может кто-нибудь объяснить подробно?

С моей веб-камеры я получаю данные ниже, после использования QVideoFrame :: map

width=640
height=480
pixelFormat=Format_RGB32
bytesPerLine=2560
mappedBytes=122880
planeCount=1

1 Ответ

0 голосов
/ 04 ноября 2018

Строка сканирования - это одна строка видеоизображения. (Термин «линия сканирования» был введен в то время, когда общепринятым методом было то, что катодный луч сканировал поверхность трубки экрана линия за линией - Линия сканирования .)

Если bytesPerLine делится на width (bytesPerLine / width = 2560/640 = 4), это дает байты на пиксель.

Если рассчитанный байт на пиксель не является целочисленным значением, то линия выравнивается по определенному кратному (обычно 4). Свернутый пример, иллюстрирующий это:

width=458
pixelFormat=Format_RGB24
bytesPerLine=1376 (a multiple of 4)

1376/458 = 3.0043668122270742358078602620087 (согласно моему калькулятору Windows)

458 * 3 = 1374 & rarr; Есть 2 байта для заполнения строки до следующего кратного 4 (байты не используются, должны игнорироваться).

В примере с OP это не проблема & ndash; формат пикселя сам по себе имеет размер, соответствующий выравниванию строк.

Итак, 4 байта соответствуют pixelFormat, в котором указано Format_RGB32, что означает:

Кадр, сохраненный в 32-битном формате RGB (0xffRRGGBB). Это эквивалентно QImage :: Format_RGB32 .

как 32 бита = 4 байта.

Количество самолетов немного сложнее. Я погуглил себя и нашел одно- и многоплоскостные API :

Некоторые устройства требуют, чтобы данные для каждого входного или выходного видеокадра помещались в непрерывные буферы памяти. В таких случаях один видеокадр должен быть адресован с использованием более чем одного адреса памяти, то есть одного указателя на «плоскость». Плоскость - это суббуфер текущего кадра.

В случае OP, есть 1 самолет & ndash; цветовые компоненты пикселя хранятся последовательно (упакованы).

Другой пример, где количество самолетов> 1: QVideoFrame::Format_YUV420P

Кадр сохраняется с использованием 8-разрядного для каждого компонента плоского формата YUV с подвыборкой плоскостей U и V по горизонтали и вертикали, т. Е. Высота и ширина плоскостей U и V вдвое меньше, чем у плоскости Y.

Это означает, что цветовые компоненты пикселя не упакованы вместе (как в Format_RGB32), но каждая плоскость хранит только один цветовой компонент одного пикселя. Чтобы восстановить пиксель, соответствующие компоненты цвета должны быть прочитаны из каждой плоскости и объединены соответственно.

В случае, когда имеется несколько плоскостей, следует использовать 2 nd аромат bytesPerLine():

int QVideoFrame::bytesPerLine(int plane) const

Возвращает количество байтов в строке сканирования плоскости .

В случае вышеупомянутого QVideoFrame::Format_YUV420P: U и V компонента по горизонтали и вертикали сэмплированы . То есть чтобы получить пиксель при (x, y) = (123, 72), компоненты должны быть прочитаны:

  • Компонент Y со смещением 72 * getBytesPerLine(0) + 123
  • U компонент со смещением 72 / 2 * getBytesPerLine(1) + 123 / 2
  • В компонент по смещению 72 / 2 * getBytesPerLine(2) + 123 / 2.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...