LINUX.ORG.RU

RTSP и OpenCV

 ,


0

1

Не удается запустить в питоноскрипте картинку через RTSP

Дистрибутив Fedora 28, opencv_version 3.4.1, python 3.6

Подрубаю RTSP-поток так:

cam = cv2.CascadeClassifier("rtsp://admin:888888@192.168.1.40:10544/udp/av0_0")

По урлке ip-видеокамеры. Эта же урл без проблем открывается в VLC

Вылетает ошибка:

VIDEOIO ERROR: V4L: device rtsp://admin:888888@192.168.1.40:10544/udp/av0_0: Unable to query number of channels
OpenCV(3.4.1) Error: Unspecified error (GStreamer: unable to start pipeline
) in cvCaptureFromCAM_GStreamer, file /builddir/build/BUILD/opencv-3.4.1/modules/videoio/src/cap_gstreamer.cpp, line 890
VIDEOIO(cvCreateCapture_GStreamer (CV_CAP_GSTREAMER_FILE, filename)): raised OpenCV exception:

OpenCV(3.4.1) /builddir/build/BUILD/opencv-3.4.1/modules/videoio/src/cap_gstreamer.cpp:890: error: (-2) GStreamer: unable to start pipeline
 in function cvCaptureFromCAM_GStreamer

CvCapture_OpenNI::CvCapture_OpenNI : Failed to open input file (rtsp://admin:888888@192.168.1.40:10544/udp/av0_0): Bad file extension
OpenCV(3.4.1) Error: Assertion failed (scn == 3 || scn == 4) in cvtColor, file /builddir/build/BUILD/opencv-3.4.1/modules/imgproc/src/color.cpp, line 11147
Traceback (most recent call last):
  File "/mnt/Test/pyface/recognizer.py", line 13, in <module>
    gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
cv2.error: OpenCV(3.4.1) /builddir/build/BUILD/opencv-3.4.1/modules/imgproc/src/color.cpp:11147: error: (-215) scn == 3 || scn == 4 in function cvtColor


Process finished with exit code 1

Особенно смущает «Failed to open input file». Может я как-то не так rtsp-строку ввожу?

Версия OpenCV доступная из Python3 собрана так:

python3 -c "import cv2; print(cv2.getBuildInformation())"

General configuration for OpenCV 3.4.1 =====================================
  Version control:               unknown

  Extra modules:
    Location (extra):            /builddir/build/BUILD/opencv-3.4.1/opencv_contrib-3.4.1/modules
    Version control (extra):     unknown

  Platform:
    Timestamp:                   2018-04-16T03:01:29Z
    Host:                        Linux 4.15.3-300.fc27.x86_64 x86_64
    CMake:                       3.11.0
    CMake generator:             Unix Makefiles
    CMake build tool:            /usr/bin/gmake
    Configuration:               ReleaseWithDebInfo

  CPU/HW features:
    Baseline:                    SSE SSE2 SSE3
      requested:                 SSE3
    Dispatched code generation:  SSE4_1 SSE4_2 FP16 AVX AVX2 AVX512_SKX
      requested:                 SSE4_1 SSE4_2 AVX FP16 AVX2 AVX512_SKX
      SSE4_1 (3 files):          + SSSE3 SSE4_1
      SSE4_2 (1 files):          + SSSE3 SSE4_1 POPCNT SSE4_2
      FP16 (2 files):            + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 AVX
      AVX (4 files):             + SSSE3 SSE4_1 POPCNT SSE4_2 AVX
      AVX2 (8 files):            + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2
      AVX512_SKX (0 files):      + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2 AVX_512F AVX512_SKX

  C/C++:
    Built as dynamic libs?:      YES
    C++11:                       YES
    C++ Compiler:                /usr/bin/c++  (ver 8.0.1)
    C++ flags (Release):         -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -mcet -fcf-protection -Wl,--as-needed   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -Wno-implicit-fallthrough -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -fopenmp -DNDEBUG  -DNDEBUG
    C++ flags (Debug):           -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -mcet -fcf-protection -Wl,--as-needed   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -Wno-implicit-fallthrough -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -fopenmp -g  -DDEBUG -D_DEBUG
    C Compiler:                  /usr/bin/cc
    C flags (Release):           -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -mcet -fcf-protection -Wl,--as-needed   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-narrowing -Wno-comment -Wno-implicit-fallthrough -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fvisibility=hidden -fopenmp -DNDEBUG  -DNDEBUG
    C flags (Debug):             -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -mcet -fcf-protection -Wl,--as-needed   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-narrowing -Wno-comment -Wno-implicit-fallthrough -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fvisibility=hidden -fopenmp -g  -DDEBUG -D_DEBUG
    Linker flags (Release):      -Wl,-z,relro  -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld   
    Linker flags (Debug):        -Wl,-z,relro  -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld   
    ccache:                      NO
    Precompiled headers:         NO
    Extra dependencies:          dl pthread rt /lib64/libGL.so /lib64/libGLU.so /lib64/libtbb.so ClpSolver Clp CoinUtils bz2 z m
    3rdparty dependencies:

  OpenCV modules:
    To be built:                 aruco bgsegm bioinspired calib3d ccalib core cvv datasets dpm face features2d flann freetype fuzzy hdf hfs highgui img_hash imgcodecs imgproc java_bindings_generator line_descriptor ml objdetect optflow phase_unwrapping photo plot python2 python3 python_bindings_generator reg rgbd saliency shape stereo stitching structured_light superres surface_matching tracking ts video videoio videostab ximgproc xobjdetect xphoto
    Disabled:                    js world
    Disabled by dependency:      dnn_objdetect sfm text
    Unavailable:                 cnn_3dobj cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev java matlab ovis viz
    Applications:                tests perf_tests examples apps
    Documentation:               doxygen python
    Non-free algorithms:         NO

  GUI: 
    QT:                          YES (ver 5.10.1)
      QT OpenGL support:         YES (Qt5::OpenGL 5.10.1)
    GTK+:                        NO
    OpenGL support:              YES (/lib64/libGL.so /lib64/libGLU.so)
    VTK support:                 NO

  Media I/O: 
    ZLib:                        /lib64/libz.so (ver 1.2.11)
    JPEG:                        /lib64/libjpeg.so (ver )
    WEBP:                        /lib64/libwebp.so (ver encoder: 0x020e)
    PNG:                         /lib64/libpng.so (ver 1.6.34)
    TIFF:                        /lib64/libtiff.so (ver 42 / 4.0.9)
    JPEG 2000:                   /lib64/libjasper.so (ver 2.0.14)
    OpenEXR:                     /lib64/libImath.so /lib64/libIlmImf.so /lib64/libIex.so /lib64/libHalf.so /lib64/libIlmThread.so (ver 2.2.0)
    GDAL:                        YES (/lib64/libgdal.so)
    GDCM:                        YES (ver 2.8.4)

  Video I/O:
    DC1394:                      YES (ver 2.2.2)
    GStreamer:                   
      base:                      YES (ver 1.14.0)
      video:                     YES (ver 1.14.0)
      app:                       YES (ver 1.14.0)
      riff:                      YES (ver 1.14.0)
      pbutils:                   YES (ver 1.14.0)
    OpenNI:                      YES (ver 1.5.7, build 10)
    OpenNI PrimeSensor Modules:  YES (/lib64/libXnCore.so)
    UniCap:                      YES (ver 0.9.12)
    UniCap ucil:                 YES (ver 0.9.10)
    libv4l/libv4l2:              1.12.5 / 1.12.5
    v4l/v4l2:                    linux/videodev2.h
    Intel Media SDK:             NO
    gPhoto2:                     YES

  Parallel framework:            TBB (ver 2018.0 interface 10002)

  Trace:                         YES (built-in)

  Other third-party libraries:
    VA:                          YES
    Lapack:                      YES (/lib64/libopenblas.so)
    Eigen:                       YES (ver 3.3.4)
    Custom HAL:                  NO
    Protobuf:                    /lib64/libprotobuf.so (3.5.0)

  NVIDIA CUDA:                   NO

  OpenCL:                        YES (no extra features)
    Include path:                /builddir/build/BUILD/opencv-3.4.1/3rdparty/include/opencl/1.2
    Link libraries:              Dynamic load

  Python 2:
    Interpreter:                 /usr/bin/python2.7 (ver 2.7.14)
    Libraries:                   /lib64/libpython2.7.so (ver 2.7.14)
    numpy:                       /usr/lib64/python2.7/site-packages/numpy/core/include (ver 1.14.1)
    packages path:               lib64/python2.7/site-packages

  Python 3:
    Interpreter:                 /usr/bin/python3 (ver 3.6.5)
    Libraries:                   /lib64/libpython3.6m.so (ver 3.6.5)
    numpy:                       /usr/lib64/python3.6/site-packages/numpy/core/include (ver 1.14.1)
    packages path:               lib64/python3.6/site-packages

  Python (for build):            /usr/bin/python2.7
    Pylint:                      /usr/bin/pylint (ver: 1.7.5, checks: 116)

  Java:                          
    ant:                         NO
    JNI:                         NO
    Java wrappers:               NO
    Java tests:                  NO

  Matlab:                        NO

  Install to:                    /usr
-----------------------------------------------------------------

GStreamer плагины установлены. Что ему не хватает?

★★★★★

Ответ на: комментарий от ox55ff

Хмм, не хочет

по твоей команде:

$ gst-launch-1.0 -v playbin uri=rtsp://admin:888888@192.168.1.40:10544/udp/av0_0
Установка конвейера в состояние PAUSED…
Конвейер работает и не требует состояния PREROLL…
/GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0: ring-buffer-max-size = 0
/GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0: buffer-size = -1
/GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0: buffer-duration = -1
/GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0: use-buffering = false
/GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0: download = false
/GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0: uri = rtsp://admin:888888@192.168.1.40:10544/udp/av0_0
/GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0: connection-speed = 0
/GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0: source = "\(GstRTSPSrc\)\ source"
Ход выполнения: (open) Opening Stream
Ход выполнения: (connect) Connecting to rtsp://admin:888888@192.168.1.40:10544/udp/av0_0
Ход выполнения: (open) Retrieving server options
ОШИБКА: из элемента /GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0/GstRTSPSrc:source: Не удалось прочитать из ресурса.
Дополнительная отладочная информация:
gstrtspsrc.c(5913): gst_rtsp_src_receive_response (): /GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0/GstRTSPSrc:source:
Could not receive message. (System error)
ОШИБКА: конвейер не хочет подготавливаться (PREROLL).
Установка конвейера в состояние PAUSED…
Установка конвейера в состояние READY…
Установка конвейера в состояние NULL…
Освобождение конвейера…

По другой команде:

$ gst-launch-1.0 rtspsrc location=rtsp://admin:888888@192.168.1.40:10544/udp/av0_0 ! decodebin ! autoaudiosink
Установка конвейера в состояние PAUSED…
Конвейер работает и не требует состояния PREROLL…
Ход выполнения: (open) Opening Stream
Ход выполнения: (connect) Connecting to rtsp://admin:888888@192.168.1.40:10544/udp/av0_0
Ход выполнения: (open) Retrieving server options
ОШИБКА: из элемента /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0: Не удалось прочитать из ресурса.
Дополнительная отладочная информация:
gstrtspsrc.c(5913): gst_rtsp_src_receive_response (): /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0:
Could not receive message. (System error)
ОШИБКА: конвейер не хочет подготавливаться (PREROLL).
Установка конвейера в состояние PAUSED…
Установка конвейера в состояние READY…
Установка конвейера в состояние NULL…
Освобождение конвейера…

Siado ★★★★★ ()
Ответ на: комментарий от ox55ff

Короче залепил с помощью user-id и user-pw. как здесь сказано: http://gstreamer-devel.966125.n4.nabble.com/Streaming-from-IP-camera-with-aut... Такая же тема:

$ gst-launch-1.0 rtspsrc location=rtsp://192.168.1.40:10544/udp/av0_0 user-id=admin user-pw=888888 protocols="tcp"  ! rtph264depay ! decodebin ! videoconvert ! autovideosink
Установка конвейера в состояние PAUSED…
Конвейер работает и не требует состояния PREROLL…
Ход выполнения: (open) Opening Stream
Ход выполнения: (connect) Connecting to rtsp://192.168.1.40:10544/udp/av0_0
Ход выполнения: (open) Retrieving server options
ОШИБКА: из элемента /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0: Не удалось прочитать из ресурса.
Дополнительная отладочная информация:
gstrtspsrc.c(5913): gst_rtsp_src_receive_response (): /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0:
Could not receive message. (System error)
ОШИБКА: конвейер не хочет подготавливаться (PREROLL).
Установка конвейера в состояние PAUSED…
Установка конвейера в состояние READY…
Установка конвейера в состояние NULL…
Освобождение конвейера…
Siado ★★★★★ ()

Правильный путь - не использовать захват видео из OpenCV. Там есть несколько принципиальных проблем с архитектурой. Как только захочешь реалтайм с какой-то человеческой задержкой - сразу огребешь проблем.

Norgat ★★★★★ ()
Ответ на: комментарий от Siado

Обнаружил, что RTSP поток перестал считываться в том числе и через VLC

Перезапустил камеру, в итоге питонопрограмма на OpenCV ругается на:

VIDEOIO ERROR: V4L: device rtsp://admin:888888@192.168.1.40:10544/udp/av0_0: Unable to query number of channels

Но не останавливается, продолжает работать. Видео не показывает.

Через gst-launch выдает такую ерунду и тоже не останавливается, продолжает работать, но без отображения видео:

$ gst-launch-1.0 rtspsrc location=rtsp://admin:888888@192.168.1.40:10544/udp/av0_0 ! decodebin ! autoaudiosink
Установка конвейера в состояние PAUSED…
Конвейер работает и не требует состояния PREROLL…
Ход выполнения: (open) Opening Stream
Ход выполнения: (connect) Connecting to rtsp://admin:888888@192.168.1.40:10544/udp/av0_0
Ход выполнения: (open) Retrieving server options
Ход выполнения: (open) Retrieving media info
Ход выполнения: (request) SETUP stream 0
Ход выполнения: (request) SETUP stream 1
Ход выполнения: (open) Opened Stream
Установка конвейера в состояние PLAYING…
New clock: GstSystemClock
Ход выполнения: (request) Sending PLAY request
Ход выполнения: (request) Sending PLAY request
Ход выполнения: (request) Sent PLAY request
Перераспределение латентности…

При этом через VLC сейчас все прекрасно показывает

Siado ★★★★★ ()
Последнее исправление: Siado (всего исправлений: 1)
Ответ на: комментарий от Siado

Судя по логу конвейер работает. У тебя стоит audiosink, а ты хочешь, чтобы показывало.

В rtsp строке есть слово udp. Может у камеры есть другие форматы? tcp?

Если камера китайский нонаме, то могут быть проблемы. Китайцы творчески подходят к соблюдению стандартов.

ox55ff ★★ ()
Ответ на: комментарий от ox55ff

Может у камеры есть другие форматы? tcp?

С tcp пробовал, та же ерунда, в логах выше есть tcp. Как бы так определить где косяк, в камере или сам опенцв перекомпилять?

Siado ★★★★★ ()
Ответ на: комментарий от ox55ff

Если камера китайский нонаме, то могут быть проблемы. Китайцы творчески подходят к соблюдению стандартов.

Совсем не исключено, но тот же VLC же вывозит rtsp с этой камеры

Siado ★★★★★ ()

А ты CascadeClassifier с VideoCapture часом не попутал? Я как-то очень сомневаюсь что тебе по rtsp нужно описание классификатора потоково получать...

klokik ()
Ответ на: комментарий от klokik

Попутал, на момент написания поста. Так и скопипастил, когда пост писал. Но в коде видео забираю вот так:

cam = cv2.VideoCapture(«rtsp://admin:888888@192.168.1.40:10544/udp/av0_0»)

Siado ★★★★★ ()
Ответ на: комментарий от Siado

С tcp пробовал, та же ерунда, в логах выше есть tcp.

Я имел ввиду здесь udp/av0_0.

Как бы так определить где косяк, в камере или сам опенцв перекомпилять?

Если opencv в качестве бекенда использует gstreamer, то нет смысла ковырять opencv пока в голом gstreamer не заработало.

ox55ff ★★ ()
Ответ на: комментарий от Siado

libav в отдельном потоке (у меня работает, друг делал свое решение на libvlc если я не ошибаюсь - тоже рабочий подход). Кадры отдавать из этого потока через буффер с которым ты сможешь работать так, как посчитаешь нужным.

Вот тут объясняется суть архитектурной проблемы которую можно словить на real time задачах (почему отдельный поток нужен): https://01.org/developerjourney/problems-camera-lag

По libav - просто погугли как в libav принимать кадр + как из буффера libav делать cv::Mat. Готовые решения уже есть.

Norgat ★★★★★ ()
Ответ на: комментарий от ox55ff

Если opencv в качестве бекенда использует gstreamer, то нет смысла ковырять opencv пока в голом gstreamer не заработало.

gstreamer-ffmpeg gstreamer1-ffmpeg gstreamer-rtsp gstreamer1-vaapi

Какие-то из этих пакетов помогли, чтобы RTSP подтянулся

Siado ★★★★★ ()
Ответ на: комментарий от Norgat

Ну да, есть такая проблема. После того как все-таки прикрутил RTSP наблюдается задержка видео около 2 секунд.

По сути для риалтайм задач можно MotionJPEG обойтись

Siado ★★★★★ ()
Ответ на: комментарий от Norgat

libav в отдельном потоке (у меня работает, друг делал свое решение на libvlc если я не ошибаюсь - тоже рабочий подход).

К стати тут вопрос. Патчить то что предлагается? libav или OpenCV? Если через тот же libav или libvlc тянуть RTSP - то все равно задержка же будет 1-3 секунды

Siado ★★★★★ ()
Ответ на: комментарий от Siado

После того как все-таки прикрутил RTSP наблюдается задержка видео около 2 секунд.

Поставь свойство latency=0 для rtspsrc. Если будет глючить поднимай, пока не станет норм. Там по умолчанию стоит 2000. Измеряется в миллисекундах.

А вообще наличие B кадров в h264 потоке гарантирует задержку отличную от нуля.

ox55ff ★★ ()
Ответ на: комментарий от Norgat

Хм, с чего бы такая большая задержка у тебя? У меня с RTSP+libav 0.2-0.5 сек максимум задержка была.

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

Siado ★★★★★ ()