Как получать прямую трансляцию с IP-камеры с помощью opencv?

#python-3.x #tensorflow #opencv #machine-learning #ip-camera

#python-3.x #тензорный поток #opencv #машинное обучение #ip-камера

Вопрос:

Я создаю проект, в котором я снимаю видео с веб-камеры или USB-камеры или с URL-адреса и выполняю обнаружение объектов на видео с помощью машинного обучения tensorflow API. Все работает нормально, если я беру входное видео с веб-камеры или внешней USB-камеры, но когда я беру ввод с IP-камеры, используя url, код завершается ошибкой после запуска в течение 30-40 секунд. Мой код выглядит так

 import cv2
vid = cv2.VideoCapture(“rtsp://x.xx.xx.xx:554”) 
While(True) 
  _,img = vid.read()
  img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
  final_img = show_inference(detection_model , img)

  final_img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)

  cv2.imshow(‘frame’, final_img)
  If cv2.waitkey(1)
    break
Vid.release()

cv2.destroyAllWindows()
 

Это отлично работает, когда я выполняю его с помощью веб-камеры или USB-камеры, используя строки ниже:

cv2.VideoCapture(0) или cv2.VideoCapture(1)

Но когда я запускаю с помощью url, он показывает мне кадр в течение 30-40 секунд, а затем завершается с ошибкой ниже

 OpenCV(4.4.0)sourcecolor.cpp:182: error:(-215:Asertion failed)!_src.empty() in function ‘cv::cvtColor’
 

Мне кажется, что библиотеке opencv не удается захватить прямую трансляцию с URL, а затем происходит сбой кода.
У кого-нибудь есть идеи, как решить эту проблему, ниже приведены версии и спецификации, которые я использую:

  • Использование Tensorflow 2.0 на компьютере i5 без графического процессора
  • PTZ IP-камера Hikvision
  • Версия Python 3.7
  • Версия Opencv 4.4

Ответ №1:

код:

  • проверьте vid.isOpened() . если это не так, не читайте.
  • скажем rv, img = vid.read()
  • убедитесь, что значение rv равно True, иначе прервите цикл

вы каким-либо образом регулируете прием кадров? ваш шаг вывода занимает много времени?

установите для камеры более низкое значение FPS. камера будет создавать кадры с собственной скоростью. для вас это не остановится и не замедлится.

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

Комментарии:

1. На данный момент я никоим образом не регулирую кадры. Да, мой шаг вывода занимает больше времени. Но код всегда работает правильно с веб-камерой, и этап вывода занимает больше времени при использовании веб-камеры. Можете ли вы предложить несколько способов, как перехватывать кадры с требуемой скоростью или сопоставлять скорость получения со скоростью чтения. Может ли многопоточность помочь здесь?

2. драйвер для веб-камеры может быть более щадящим, чем код, обрабатывающий сетевой поток. да, многопоточность может помочь, если вы все сделаете правильно. запустите поток, который непрерывно считывает кадры и сохраняет самый последний кадр. любые потребители читают этот кадр, когда им нужно. используйте объект условия python для уведомления потребителей о новых кадрах.

3. используйте это, изменяйте по мере необходимости. gist.github.com/crackwitz/15c3910f243a42dcd9d4a40fcdb24e40

4. Драйвер IP-камеры и соответствующее программное обеспечение не помогли. Я обязательно попробую многопоточность. Также я попытался открыть тот же URL-адрес с помощью opencv без использования какого-либо алгоритма машинного обучения, он работал нормально. Это подводит меня к выводу, что мне нужно найти способ ускорить машинное обучение в потоке IP. Есть идеи по этому поводу?

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