Проблема Захват изображения с FLIR Boson с openCV на Jetson TX2
Когда я пытаюсь открыть веб-камеру (FLIR Boson) с OpenCV на Jetson TX2, выдается следующая ошибка:
libv4l2: error set_fmt gave us a different result then try_fmt!
VIDEOIO ERROR: libv4l unable convert to requested pixfmt
Я использую этот скрипт Python:
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
# Our operations on the frame come here
# Display the resulting frame
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
Хотя он отображает видео, он показывает эти ошибки. Причиной этого является то, что я пытаюсь заставить FLIR Boson работать с Jetson TX2, на котором запущена эта программа https://github.com/naisy/realtime_object_detection
У меня это работает с обычной веб-камерой, но с FLIR Boson дает
libv4l2: error set_fmt gave us a different result then try_fmt!
VIDEOIO ERROR: libv4l unable convert to requested pixfmt
VIDEOIO ERROR: V4L: Initial Capture Error: Unable to load initial memory buffers.
Segmentation fault (core dumped)
вышеуказанная ошибка и закрывается. В моем исследовании этой ошибки, кажется, нашли людей, которые используют веб-камеры, которые являются монохромными, глядя на этот https://www.flir.com/support-center/oem/is-there-a-way-to-maximize-the-video-display-on-the-boson-app-for-windows-pc-to-full-screen/ Мне интересно, нужно ли мне настраивать OpenCV или драйвер V4L2, чтобы выбрать правильный формат для веб-камеры, чтобы предотвратить ошибки.
У меня также есть Jetson Xavier, и на нем работает та же самая программа обнаружения объектов (она просто имеет разную сборку OpenCV и Tensorflow), поэтому я предполагаю, что есть несколько другая конфигурация, связанная с совместимостью формата веб-камеры при установке OpenCV на Ксавье против TX2. Я новичок во всем этом, так что прости меня, если я попрошу больше разъяснений.
И последняя информация, которая не относится к руководству FLIR Boson по USB:
8.2.2 USB Boson способен предоставлять цифровые данные как устройство, совместимое с USB Video Class (UVC). Предусмотрены два варианта вывода. Обратите внимание, что параметры выбираются не через CCI, а с помощью программного обеспечения для захвата видео или просмотра, выбранного пользователем. Варианты:
■ Pre-AGC (16 бит): выходной сигнал линейно пропорционален падающему потоку на каждый пиксель в массиве; выходное разрешение составляет 320x256 для конфигурации 320, 640x512 для конфигурации 640. Обратите внимание, что настройки AGC, настройки масштабирования и настройки цветовой кодировки не влияют на выходной сигнал в этой точке касания. Эта опция обозначена кодом формата 4CC UVC-видео "Y16" (16-битное несжатое изображение в оттенках серого)
■ Post-Colorize, YCbCrb: вывод преобразуется в цветовое пространство YCbCr с использованием указанной цветовой палитры (см. Раздел 6.7). Разрешение составляет 640x512 для конфигураций 320 и 640. Предусмотрено три варианта, идентифицируемых с помощью кода видео формата UVC 4CC:
• I420: 8-битная плоскость Y, за которой следуют 8-битные субсэмплированные 2x2 плоскости U и V
• NV12: 8-битная плоскость Y, за которой следует чередующаяся плоскость U/V с подвыборкой 2x2
• NV21: то же, что NV12, за исключением обратного порядка плоскостей U и V
Я попытался переустановить все несколько раз, хотя для перепрошивки TX2 и переустановки открытых CV и Tensorflow требуется несколько часов. Я пробовал две разные "сборки" opencv. Я пытался просматривать веб-камеру с сыром и никогда не было проблем.
2 ответа
Я не работаю с Python, но вам нужно отключить преобразование в RGB:
cap.set(cv.CAP_PROP_CONVERT_RGB, 0)
Увидимся v4l пример из OpenCV.
Я смог найти способ заставить его работать, используя приведенный ниже код. Казалось, проблема с открытым CV, взаимодействующим с v4l2.
pipeline = "v4l2src device=/dev/video1 ! video/x-raw,width=640,height=512,format=(string)I420,pixel-aspect-ratio=1/1, interlace-mode=(string)progressive, framerate=30/1 ! videoconvert ! appsink"
cap = cv2.VideoCapture(pipeline, cv2.CAP_GSTREAMER)