Как использовать OpenCV с камерой на Jetson Nano с Yocto / poky

Я создал минимальный образ xfce с помощью Yocto / poky на Jetson Nano, используя ветви warrior (poky warrior, meta-tegra warrior-l4t-r32.2, openembedded warrior) и CUDA 10.

Изображение загружается и работает отлично, а тест камеры:

$ gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method=0 ! 'video/x-raw,width=960, height=616' ! nvvidconv ! nvegltransform ! nveglglessink -e

работает как шарм.

Теперь я хотел бы использовать OpenCV для канала камеры, но я не могу заставить его работать.

Я добавил эти пакеты в IMAGE_INSTALL:

...
opencv \
libopencv-core \
libopencv-imgproc \
opencv-samples \
gstreamer1.0-omx-tegra \
python3 \
python3-modules \
python3-dev \
python-numpy \
...

Чтобы установить OpenCV. Когда я запускаю / usr / bin / opencv_version, он возвращает версию 3.4.5, версия python - 3.7.2, а версия GCC - 7.2.1.

Когда я пытаюсь запустить этот тестовый код OpenCV, он возвращает

[ WARN:0] VIDEOIO(createGStreamerCapture(filename)): trying ...

(python3.7:5163): GStreamer-CRITICAL **: ..._: gst_element_get_state: assertion 'GST_IS_ELEMENT (element)' failed
[ WARN:0] VIDEOIO(createGStreamerCapture(filename)): result=(nil) isOpened=-1 ...

Unable to open camera

Я пробовал искать в Интернете решения, но они, похоже, не работают.

РЕДАКТИРОВАТЬ: похоже, проблема с использованием CAP_GSTREAMER в функции VideoCapture, поскольку запуск той же программы с CAP_FFMPEG вместо этого отлично работает с видео mp4.

Использование cv2.VideoCapture("/dev/video0", CAP_FFMPEG) просто возвращает с isOpen = -1. Как заставить камеру открываться в Python?


person Varyag    schedule 18.09.2019    source источник


Ответы (2)


Это конвейер, который, как вы сказали, работает на вас:

gst-launch-1.0 -v nvarguscamerasrc ! 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method=0 ! 'video/x-raw,width=960, height=616' ! nvvidconv ! nvegltransform ! nveglglessink -e

Это конвейер, который упоминается в скрипте:

gst-launch-1.0 -v nvarguscamerasrc ! 'video/x-raw(memory:NVMM),width=3280, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method=0 ! 'video/x-raw, width=820, height=616, format=BGRx' ! videoconvert ! video/x-raw, format=BGR ! appsink

Разница между рабочими и неработающими конвейерами заключается в добавлении videoconvert и appsink. Ошибка GStreamer-CRITICAL **: ..._: gst_element_get_state: assertion 'GST_IS_ELEMENT (element)' failed указывает на то, что в вашей системе отсутствует какой-то элемент GStreamer. Вы можете попробовать добавить недостающие плагины, добавив к своему изображению следующую группу пакетов:

gstreamer1.0-plugins-base

В качестве альтернативы вы можете заменить конвейер в face_detect.py на свой рабочий конвейер, но имейте в виду, что сценарию, вероятно, необходимо преобразовать видео в BGR, прежде чем передавать его в appsink, чтобы алгоритм работал. Возможно, вам потребуется поискать документацию для элемента nvidconv, чтобы узнать, поддерживается ли он.

РЕДАКТИРОВАТЬ: Судя по вашему комментарию, возможно, вам тоже не хватало gstreamer1.0-python.

person seldak    schedule 18.09.2019
comment
Когда я пытаюсь запустить bitbake gstreamer1.0-plugin-base, он говорит, что он уже построен и поэтому должен быть частью образа. И я также попытался взять работающий конвейер и заменить конвейер face_detect.py, но все равно та же ошибка ... Это действительно неприятная проблема, так как я знаю, что и камера, и OpenCV работают - но сейчас не вместе. - person Varyag; 19.09.2019
comment
Когда я пытаюсь запустить gst-launch-1.0 -v nvarguscamerasrc ! 'video/x-raw(memory:NVMM),width=3280, height=2464, framerate=21/1, fflip?methodormat=NV12' ! nvvidconv flip-method=0 ! 'video/x-raw, width=820, height=616, format=BGRx' ! videoconvert ! video/x-raw, format=BGR ! appsink Возвращает WARNING: erroneous pipeline: no element "videoconvert" - person Varyag; 19.09.2019
comment
Я думаю, мне не хватает некоторых зависимостей или чего-то в этом роде? Я просто не имею ни малейшего представления, что и как нужно на данный момент - person Varyag; 19.09.2019
comment
@MichaelChristensen Запуск bitbake <recipe> и отображение отсутствия новых задач не означает, что это часть изображения. Это может означать, что его построила какая-то другая зависимость. Попробуйте добавить упомянутый рецепт к своему изображению или через IMAGE_INSTALL в local.conf, чтобы быть уверенным. - person seldak; 19.09.2019
comment
@MichaelChristensen, элемент no videoconvert подтверждает, что базовые плагины Gstreamer не существуют на вашей плате. Добавьте gstreamer1.0-plugins-base к изображению, как указано в ответе. - person seldak; 19.09.2019
comment
Я сделал ту же ошибку, поэтому попытался добавить все остальное. Я все равно удалил свой ответ, но вы думаете, что, возможно, другие пакеты gstream: gstreamer1.0-plugins-good \ gstreamer1.0-plugins-bad \ gstreamer1.0-plugins-ugly \ gstreamer1.0-python \ Могут ли повлиять на его работу? - person Varyag; 19.09.2019
comment
@MichaelChristensen Это действительно зависит от вашего конвейера. Вот почему я попросил в своем удаленном комментарии увидеть вывод -v (если все в порядке, вы можете попробовать загрузить в pastebin). В качестве дополнительной подсказки вы также можете вызывать gst-inspect-1.0 в плагинах. Глядя на ваш конвейер, я предполагаю, что вам нужны gstreamer1.0-plugins-base, gstreamer1.0-omx-tegra и gstreamer1.0-python. Остальное, думаю, не нужно. - person seldak; 19.09.2019

Используйте следующий конвейер gstreamer:

stream = 'nvarguscamerasrc! видео / x-raw (память: NVMM), ширина =% d, высота =% d, формат = (строка) NV12, частота кадров = (дробь)% d / 1! nvvidconv flip-method =% d! nvvidconv! video / x-raw, width = (int)% d, height = (int)% d, format = (string) BGRx! видеоконвертировать! appsink '% (1280, 720, 30,0, 640, 480)

cap = cv2.VideoCapture (поток, cv2.CAP_GSTREAMER)

Это решит проблему

person Anchal Gupta    schedule 01.10.2019