#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-камеры мусором