@Devil_Evil2021

Как описать обработку исключения при неудачной попытке подключения к IP-камере?

1. Как описать обработку исключения при неудачной попытке подключится к трансляции IP-камеры в локальной сети?
Если использовать просто try/except, то ничего не происходит.
В консоли только ошибка, а до блока except не доходит, но программа не вылетает.
60b89cb4d59a2377231276.png
60b89cdcda263002070147.png
a1 = self.lineIPadress.text()
        if a1 == '':
            exPR.about(self, "Ошибка", "Поле IP-адреса не должно быть пустым.")
        else:

            #cam = cv2.VideoCapture('http://' + a1 + '/video')
            #cam = cv2.VideoCapture(a1)
            try:
                w1 = cam.get(cv2.CAP_PROP_FRAME_WIDTH)
                h1 = cam.get(cv2.CAP_PROP_FRAME_HEIGHT)

                minW = 0.1*w1
                minH = 0.1*h1

                names = facename

                while(cam.isOpened()):
        
                    ret, img =cam.read()

                    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
                    faces = faceCascade.detectMultiScale( 
                         gray,
                         scaleFactor = 1.2,
                         minNeighbors = 5,
                         minSize = (int(minW), int(minH)),
                         )

                     for(x,y,w,h) in faces:

                        cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)

                        id, confidence = recognizer.predict(gray[y:y+h,x:x+w])

                        if (confidence < 100):
                            id = names[id]
                            confidence = "  {0}%".format(round(100 - confidence))
               
                        else:
                            id = "unknown"
                            confidence = "  {0}%".format(round(100 - confidence))

                        cv2.putText(img, str(id), (x+5,y-5), font, 1, (255,255,255), 2)
                        cv2.putText(img, str(confidence), (x+5,y+h-5), font, 1, (255,255,0), 1) 
                    
                    cv2.imshow('Camera',img)             
       
                    k = cv2.waitKey(10) & 0xff # Press 'ESC' for exiting video
                    if k == 27:
                        break

                cam.release()
                cv2.destroyAllWindows()
            except:
                print("ошибка")


2. Что лучше писать в конце IP-адреса, чтобы подключиться к любой IP-камере в локальной сети, если в ней нет пароля/логина?
Например, 192.168.43.1:8080/video(в таком случае работает, если телефон использовать как IP-камеру) или 192.168.43.1:8080/1
  • Вопрос задан
  • 161 просмотр
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
1. OpenCV умеет работать с четырьмя источниками видео: видеофайл, набор файлов-кадров, подключённая камера, видеопоток по сети. На втором скриншоте ошибка про CAP_IMAGES намекает, что OpenCV пытается интепретировать URL во втором режиме вместо четвёртого. Стоит указать дополнительный параметр конструктора VideoCapture, задающий режим открытия источника видео.

2. API OpenCV довольно непоследователен в своей сигнализации ошибок, и выбрасывает исключения только если скормить функции некорректные данные. Ситуации типа некорректного формата изображения сигнализируются возвращаемыми значениями. В вашем случае всё, что остаётся - подождать пару секунд, периодически опрашивая isOpened(). Если она не вернула истину по окончанию интервала, считаем попытку неудавшейся. Альтернатива - пытаться перехватывать сообщенеи в консоль, оно, похоже, выводится стандартным модулем logging. Но это тот ещё хак.

3. Точный URL зависит от вида и конфигурации ПО, которое используется для web-стриминга. Заранее не узнаешь. Максимум - можно попытаться нагуглить URL по умолчанию для наиболее популярных версий такого ПО и пробовать их по очереди.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
A_M
@A_M
Основная специализация - системы видеонаблюдения
Недостаточно компетентен, чтобы ответить на 1 часть вопроса.
По второй части есть комментарий. Как я понимаю, сейчас вы работаете с mjpeg over http (судя по формату обращения). В современных камерах работа с mjpeg - стремящаяся к нолю величина. Большинство камер работают через rtsp-потоки, которые можно разбирать на кадры в ffmpeg и уже потом скармливать opencv (но это уже вне моей компетенции, теоретические размышления) Касаемо вопроса подбора формата rtsp-запроса (или mjpeg-запроса) - или индивидуально интегрировать запросы каждого производителя, или разобраться с получением его из профиля ONVIF (вас должен интересовать profile S и T)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы