одновременная потоковая передача 2 камер на python с поддержкой ip-камер

#python #opencv #cv2

#python #opencv #cv2

Вопрос:

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

Ошибка значения: слишком много значений для распаковки (ожидается 2)

это код для потоковой передачи 2 или более камер

 import urllib.request
import time
import numpy as np
import cv2

video_capture_0 = cv2.VideoCapture(0)
video_capture_1 = cv2.VideoCapture(1)

while True:
    
    ret0, frame0 = video_capture_0.read()
    ret1, frame1 = video_capture_1.read()
    

    if (ret0):
        cv2.imshow('Cam 0', frame0)

    if (ret1):
        cv2.imshow('Cam 1', frame1)

    if cv2.waitKey(1) amp; 0xFF == ord('q'):
        break

video_capture_0.release()
video_capture_1.release()
cv2.destroyAllWindows()
 

и это код для потоковой передачи IP-камеры

 import urllib.request
import cv2
import numpy as np
import time
URL = "http://10.28.193.74:8080/shot.jpg"
while True:
    img_arr = np.array(bytearray(urllib.request.urlopen(URL).read()),dtype=np.uint8)
    img = cv2.imdecode(img_arr,-1)
    cv2.imshow('IPWebcam',img)

    if cv2.waitKey(1) amp; 0xFF == ord('q'):
        break;

    
cv2.destroyAllWindows()
 

И вот моя неудачная попытка объединить коды

 import urllib.request
import cv2
import numpy as np
import time
URL = "http://10.28.193.74:8080/shot.jpg"
video_capture_0 = cv2.VideoCapture(0)
while True:
    ret0, frame0 = video_capture_0.read()
    img_arr = np.array(bytearray(urllib.request.urlopen(URL).read()),dtype=np.uint8)
    ret1, img = cv2.imdecode(img_arr,-1)

    if (ret0):
        
        cv2.imshow('Cam 0', frame0)

    if (ret1):

        cv2.imshow('IPWebcam',img)


    if cv2.waitKey(1) amp; 0xFF == ord('q'):
        break

    
cv2.destroyAllWindows()
 

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

1. всегда помещайте полное сообщение об ошибке (начинающееся со слова «Traceback») в вопрос (не комментарий) в виде текста (не скриншота). Есть и другая полезная информация.

Ответ №1:

На первый взгляд cv2.imdecode не возвращает значение для ret1

video_capture.read() вернет два значения: логическое значение, представляющее, был ли кадр успешно прочитан, и числовую матрицу, содержащую кадр

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

вы можете заменить if(ret1): на if(img is not None): maybe, чтобы проверить, не является ли кадр с ip-камеры мусором