похоже, что вы отображаете изображение в совершенно неправильном формате.
при работе с v4l2 вы обязательно должны проверить " libv4l " (упакован в debian, поэтому также доступен в ubuntu). v4l2 позволяет устройству выводить свои кадры в любом из очень большого числа видеоформатов, некоторые из которых сжимаются (например, с использованием jpeg).
Core v4l2 не предоставляет никаких средств для преобразования изображения в определенный формат, поддерживаемый вашим приложением, поэтому теоретически ваше приложение должно поддерживать все возможные форматы.
во избежание дублирования кода (каждое приложение с поддержкой v4l2 сталкивается с одной и той же проблемой!), Была создана libv4l: она обеспечивает низкоуровневый доступ к устройству, но в то же время гарантирует, что к кадру можно получить доступ, используя несколько стандартные форматы.
например если устройство поддерживает только jpeg-output и ваше приложение запрашивает кадры RGB32, libv4l будет конвертировать для вас прозрачно.
вы даже можете использовать libv4l с некоторыми трюками LD_PRELOAD, чтобы заставить его работать с приложениями, которые были скомпилированы без поддержки libv4l (просто чтобы проверить, имеет ли мое предложение смысл)