#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. это выходит за рамки этого вопроса. используйте мою суть, связанную ранее, чтобы обойти проблему с частотой кадров.