OpenCV. Нет изображения с веб камеры
Нет изображения (черный экран) при захвате видео с вебкамеры при помощи opencv в python. в чем причина?
Использую данный код.
import cv2
cap = cv2.VideoCapture()
cap.open(0, cv2.CAP_DSHOW)
if not cap.isOpened():
raise IOError(«Cannot open webcam»)
while(True):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow(‘frame’,gray)
if cv2.waitKey(1) & 0xFF == ord(‘q’):
break
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Ошибка OpenCV. Как сделать снимок с веб камеры?
Пытаюсь сделать снимок с веб камеры. Установил OpenCV. Делаю в colab notebook. Но на строку записи.
Opencv для Python: сопоставление изображения с камеры
Когда пытаюсь запустить вот этот код import numpy as np import cv2 cap = cv2.VideoCapture(0) .
Нет изображения с веб-камеры
Добрый день! Есть ubuntu 20.04, установленная на vmware. Ноут Dell inspiron 17 5770. На ноуте.
Нет изображения с веб-камеры при установленных драйверах
Всем привет. Купил веб-камеру, заинсталировал драйвера с диска (програмка для камеры тоже там.
Нет изображения с веб-камеры в Skype. (В других приложениях работает)
Доброго времени суток! Откуда не возьмись выползла проблема трансляции видеосигнала с веб-камеры.
Получение изображения с веб-камеры с помощью OpenCV в Python 3
Интересует, как получить изображение с веб-камеры в Python 3 с помощью OpenCV . В Python 2 получалось сделать вот так:
import cv2 cap = cv2.VideoCapture() while cap.isOpened(): ret, img = cap.read() cv2.imshow('output', img) key = cv2.waitKey(10) if key == 27: break cap.release() cv2.destroyAllWindows()
В третьем питоне просто завершается программа. А во втором исправно выводит изображение. Что не так?
Отслеживать
задан 6 авг 2017 в 15:58
768 1 1 золотой знак 13 13 серебряных знаков 30 30 бронзовых знаков
Есть ли traceback? Включите -X faulthandler
6 авг 2017 в 18:27
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
import numpy as np import cv2 cap = cv2.VideoCapture(0) while(True): ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow('Video', frame) # cv2.imshow('frame',gray) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
Отслеживать
ответ дан 17 сен 2017 в 19:34
36 3 3 бронзовых знака
Опишите словами, в чём вы видите проблему.
17 сен 2017 в 20:11
(0) нолик у меня включил камеру, но окошко не выходит, а нет. выходит.)
17 сен 2017 в 22:28
cap = cv2.VideoCapture(0)
Где (0) — для встроенной камеры, (1) — для внешней.
Отслеживать
51.6k 200 200 золотых знаков 61 61 серебряный знак 242 242 бронзовых знака
ответ дан 4 мая 2021 в 18:08
536 2 2 серебряных знака 11 11 бронзовых знаков
OpenCV на python: получение кадров, смена цветовой модели и размытие
OpenCV — это мощная библиотека машинного зрения, которую часто применяют в роботах для распознавания объектов окружающего мира. В одной из статей мы подробно описали установку OpenCV на одноплатный компьютер Raspberry Pi 3.
Переде тем как приступить непосредственно к функциям машинного зрения, нам необходимо познакомиться со вспомогательными функциями, необходимыми для работы с видеопотоком. В этом уроке мы попробуем получить кадры с видеокамеры и применим к ним различные преобразования: отражение, смена цветовой модели, размытие.
Все программы мы будем писать на языке python и запускать на Raspberry Pi 3.
Подготовка к написанию первой программы
Шаг 1. Если в ходе установки OpenCV вы использовали виртуальное окружение, то перед запуском python-скриптов необходимо перейти в это окружение с помощью команд:
$ source ~/.profile $ workon cv
Шаг 2. Для дальнейшей работы нам потребуются три дополнительных python-модуля:
- video.py
- common.py
- tst_scene_render.py
Найти эти модули можно в папке с примерами: /home/pi/Downloads/opencv-master/samples/python
Создадим в домашней папке, папку opencv и скопируем в неё эти модули:
$ cd ~ $ mkdir opencv $ cp /home/pi/Downloads/opencv-master/samples/python/video.py . $ cp /home/pi/Downloads/opencv-master/samples/python/common.py . $ cp /home/pi/Downloads/opencv-master/samples/python/tst_scene_render.py .
Шаг 3. Теперь создадим в этой же папке файл с нашей программой.
$ touch eye.py
Шаг 3. Редактировать программу можно в любом приложении. Если нет предпочтений, то рекомендуем использовать редактор Nano. Откроем в нём недавно созданный файл:
$ nano eye.py
Шаг 4. После того как программа будет написана, сохраним изменения с помощью комбинации клавиш Ctrl+o, нажмем Y для подтверждения. Затем нажмем Ctrl+x для выхода из редактора.
Получение кадров с камеры и вывод в окно
Наша программа будет в бесконечном цикле получать кадры с камеры и отображать их в специальном окне. Алгоритм программы:

Код на языке python:
import cv2 import video if __name__ == '__main__': # создаем окно с именем result cv2.namedWindow( "result" ) # создаем объект cap для захвата кадров с камеры cap = video.create_capture(0) while True: # захватываем текущий кадр и кладем его в переменную img flag, img = cap.read() try: # отображаем кадр в окне с именем result cv2.imshow('result', img) except: cap.release() raise ch = cv2.waitKey(5) if ch == 27: break cap.release() cv2.destroyAllWindows()
Примечание. Функция create_capture имеет всего один аргумент, который отвечает за индекс камеры в нашей системе. В случае, если камера всего одна, её индекс будет равен 0.
$ python eye.py
Если в программе нет ошибок, откроется окно с видео.

Отражение картинки по вертикали и горизонтали
В предыдущей программе мы брали каждый кадр, полученный с камеры и отображали его в неизменном виде. Теперь в разрыв между этими двумя операциями добавим третью — отражение кадра:

За отражение кадра отвечает функция:
flip( кадр, направление )
Здесь кадр — кадр видеопотока, который нужно отразить;
направление — флаг, определяющий направление отражения: 0 — по-горизонтали, 1 — по-вертикали, -1 — по горизонтали и вертикали одновременно.
В действительности, разные веб-камеры могут по-разному реагировать на вертикальное и горизонтальное отражение. Например, в используемой в этом уроке Logitech С110 вертикаль и горизонталь поменяны местами.
import cv2 import video if __name__ == '__main__': # создаем окно с именем result cv2.namedWindow( "result" ) # создаем объект cap для захвата кадров с камеры cap = video.create_capture(0) while True: # захватываем текущий кадр и кладем его в переменную img flag, img = cap.read() try: # отражаем кадр img = cv2.flip(img,0) # отображаем кадр в окне с именем result cv2.imshow('result', img) except: cap.release() raise ch = cv2.waitKey(5) if ch == 27: break cap.release() cv2.destroyAllWindows()

Смена цветовой модели
Цветовая модель — это модель представления цвета каждой точки с помощью группы чисел. Некий цветовой код. Например, в RGB цвет определяется тремя компонентами: красный, зеленый и синий. Любая веб-камера передает кадры именно в такой модели. А в HSV у каждой точки есть цветовой тон — H, насыщение — S и яркость — V.
Некоторые функции машинного зрения проще реализовать в какой-то конкретной модели. Например, в дальнейших уроках мы увидим, что распознавание цветовых пятен на картинке лучше работает в модели HSV.
Для преобразования цветовой модели используем функцию:
cvtColor( кадр, модель )
где модель — код преобразования:
- COLOR_GRAY — в оттенки серого;
- COLOR_RGB2HSV — из RGB в HSV;
- COLOR_BGR2HSV — из BGR в HSV;
- COLOR_HSV2BGR — обратно, из HSV в BGR;
- и т.д.
OpenCV поддерживает много моделей, но нам потребуются пока только эти три: RGB, HSV и оттенки серого.
Примечание. По-умолчанию, кадр с камеры приходят в модели BGR, а не RGB, поэтому для преобразования необходимо использовать флаг COLOR_BGR2HSV.
import cv2 import video if __name__ == '__main__': # создаем окно с именем result cv2.namedWindow( "result" ) # создаем объект cap для захвата кадров с камеры cap = video.create_capture(0) while True: # захватываем текущий кадр и кладем его в переменную img flag, img = cap.read() try: # меняем цветовую модель на HSV img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV ) # отображаем кадр в окне с именем result cv2.imshow('result', img) except: cap.release() raise ch = cv2.waitKey(5) if ch == 27: break cap.release() cv2.destroyAllWindows()
Результат работы программы:

Если в программе заменим COLOR_BGR2HSV на COLOR_GRAY, получим такую картинку:

Размытие по Гауссу
Часто, изображение с веб-камер страдает наличием большого количества шумов. Особенного это заметно, когда камере не хватает освещения. Для частичного решения этой проблемы применяют фильтр Гаусса, или другими словами размытие по Гауссу (Gaussian blur).
Функция имеет 3 аргумента:
GaussianBlur( кадр, размер ядра, отклонение)
размер ядра — список из двух чисел (x,y), которые задают размер ядра фильтра Гаусса по горизонтали и вертикали. Чем больше ядро, тем более размытым станет кадр;
отклонение — стандартное отклонение по оси X.
import cv2 import video if __name__ == '__main__': # создаем окно с именем result cv2.namedWindow( "result" ) # создаем объект cap для захвата кадров с камеры cap = video.create_capture(0) while True: # захватываем текущий кадр и кладем его в переменную img flag, img = cap.read() try: # размываем кадр img = cv2.GaussianBlur(img, (5, 5), 2) # отображаем кадр в окне с именем result cv2.imshow('result', img) except: cap.release() raise ch = cv2.waitKey(5) if ch == 27: break
Посмотрим на результат:

Надо отметить, что в OpenCV есть и другие фильтры для удаления шума: медианный фильтр, двухсторонний фильтр и усреднение.
В следующем уроке поговорим о наложении на картинку текста и графики. Это понадобится нам для выделения на кадре интересующих нас областей, а также для вывода прямо в кадр, например, координат точек и величину FPS.
Изменено: 11 Июн, 2017 17:19
OpenCV на python: получение кадров, смена цветовой модели и размытие : 11 комментариев
Константин говорит 03.04.2018 в 17:51 :
В пункте (2. Получение кадров с камеры и вывод в окно) указан код на питоне, я его копирую и вставляю в чистый файл (opencv-video-rgb-hsv-gray.py).
Но после запуска этого файла, появляется error Warning: unable to open video source: 0
Warning: unable to open video source: synth
Traceback (most recent call last):
File «opencv-video-rgb-hsv-gray.py», line 13, in
flag, img = cap.read()
AttributeError: ‘NoneType’ object has no attribute ‘read’ У меня версия cv ‘3.4.1’
Олег Евсегнеев говорит 06.04.2018 в 00:34 :
Вероятно программа не видит веб-камеру. Она точно правильно подключена и настроена?
Как вариант, в строке:
cap = video.create_capture(0)
попробуйте поменять 0 на 1.
Как получить изображение с веб камеры python

Начнем с того, что настроим клиенты и сервер.
Конфигурирование системы и установка необходимых пакетов

Сначала установим opencv и ZMQ. Чтобы избежать конфликтов, развертывание проведем в виртуальной среде:

На следующем шаге выберите опцию N1 Hostname.

На этом этапе задайте осмысленное имя хоста (например, pi-livingroom, pi-bedroom, pi-garage). Так вам будет легче ориентироваться в клиентах сети и сопоставлять имена и IP-адреса.

Далее, необходимо согласиться с изменениями и перезагрузить систему.
В некоторых сетях вы можете подключиться через SSH, не предоставляя IP-адрес явным образом:
$ ssh pi@pi-frontporch
Определение отношений сервер-клиент
Прежде чем реализовать стриминг потокового видео по сети, определим отношения клиентов и сервера. Для начала уточним терминологию:
- Клиент – устройство, отвечающее за захват кадров с веб-камеры с использованием OpenCV, а затем за отправку кадров на сервер.
- Сервер — компьютер, принимающий кадры от всех клиентов.
Конечно, и сервер, и клиент могут и принимать, и отдавать какие-то данные (не только видеопоток), но для нас важно следующее:
- Существует как минимум одна (а скорее всего, несколько) система, отвечающая за захват кадров (клиент).
- Существует только одна система, используемая для получения и обработки этих кадров (сервер).
Структура проекта
Структура проекта будет состоять из следующих файлов:
$ $ tree . ├── MobileNetSSD_deploy.caffemodel ├── MobileNetSSD_deploy.prototxt ├── client.py └── server.py 0 directories, 4 files
Два первых файла из списка соответствуют файлам предобученной нейросети Caffe MobileNet SSD для распознавания объектов. В репозитории по ссылке можно найти соответствующие файлы, чьи названия, правда, могут отличаться от приведенных ( *.caffemodel и deploy.prototxt ). Сервер ( server.py ) использует эти файлы Caffe в DNN-модуле OpenCV.
Скрипт client.py будет находиться на каждом устройстве, которое отправляет поток на сервер.
Реализация клиентского стримера на OpenCV
Начнем с реализации клиента. Что он будет делать:
- Захватывать видеопоток с камеры (USB или RPi-модуль).
- Отправлять кадры по сети через ImageZMQ.
Откроем файл client.py и вставим следующий код:
# импортируем необходимые библиотеки from imutils.video import VideoStream # захват кадров с камеры import imagezmq import argparse # обработка аргумента командной строки, содержащего IP-адрес сервера import socket # получение имени хоста Raspberry Pi import time # для учета задержки камеры перед отправкой кадров # создаем парсер аргументов и парсим ap = argparse.ArgumentParser() ap.add_argument("-s", "--server-ip", required=True, help="ip address of the server to which the client will connect") args = vars(ap.parse_args()) # инициализируем объект ImageSender с адресом сокета сервера sender = imagezmq.ImageSender(connect_to="tcp://<>:5555".format( args["server_ip"]))
Назначение импортируемых модулей описано в комментариях. В последних строчках создается объект-отправитель, которому передаются IP-адрес и порт сервера. Указанный порт 5555 обычно не вызывает конфликтов.
Инициализируем видеопоток и начнем отправлять кадры на сервер.
# получим имя хоста, инициализируем видео поток, # дадим датчику камеры прогреться rpiName = socket.gethostname() vs = VideoStream(usePiCamera=True).start() #vs = VideoStream(src=0).start() time.sleep(2.0) # задержка для начального разогрева камеры while True: # прочитать кадр с камеры и отправить его на сервер frame = vs.read() sender.send_image(rpiName, frame)
Теперь у нас есть объект VideoStream , созданный для захвата фреймов с RPi-камеры. Если вы используете USB-камеру, раскомментируйте следующую строку и закомментируйте ту, что активна сейчас.
В этом месте вы также можете установить разрешение камеры. Мы будем использовать максимальное, так что аргумент не передастся. Если вы обнаружите задержку, надо уменьшить разрешение, выбрав одно из доступных значений, представленных в таблице. Например:
vs = VideoStream(usePiCamera=True, resolution=(320, 240)).start()
Для USB-камеры такой аргумент не предусмотрен. В следующей строке после считывания кадра можно изменить его размер:
frame = imutils.resize(frame, width=320)
В последних строках скрипта происходит захват и отправка кадров на сервер.
Реализация сервера
На стороне сервера необходимо обеспечить:
- Прием кадров от клиентов.
- Детектирование объектов на каждом из входящих кадров.
- Подсчет количества объектов для каждого из кадров.
- Отображение смонтированного кадра (панели), содержащего изображения от всех активных устройств.
Последовательно заполним файл с описанием сервера server.py :
# импортируем необходимые библиотеки from imutils import build_montages # монтаж всех входящих кадров from datetime import datetime import numpy as np import imagezmq import argparse import imutils import cv2 # создаем парсер аргументов и парсим их ap = argparse.ArgumentParser() ap.add_argument("-p", "--prototxt", required=True, help="path to Caffe 'deploy' prototxt file") ap.add_argument("-m", "--model", required=True, help="path to Caffe pre-trained model") ap.add_argument("-c", "--confidence", type=float, default=0.2, help="minimum probability to filter weak detections") ap.add_argument("-mW", "--montageW", required=True, type=int, help="montage frame width") ap.add_argument("-mH", "--montageH", required=True, type=int, help="montage frame height") args = vars(ap.parse_args())
Библиотека imutils упрощает работу с изображениями (есть на GitHub и PyPi).
Пять аргументов, обрабатываемых с помощью парсера argparse :
- —prototxt : путь к файлу прототипа глубокого изучения Caffe.
- —model : путь к предообученной модели нейросети Caffe.
- —confidence : порог достоверности для фильтрации случаев нечеткого обнаружения.
- —montageW : количество столбцов для монтажа общего кадра, состоящего в нашем примере из 2х2 картинок (то есть montageW = 2) . Часть ячеек может быть пустой.
- —montageH : аналогично предыдущему пункту — количество строк в общем кадре.
Вначале инициализируем объект ImageHub для работы с детектором объектов. Последний построен на базе MobileNet Single Shot Detector.
imageHub = imagezmq.ImageHub() # инициализируем список меток классов сети MobileNet SSD, обученной # для детектирования, генерируем набор ограничивающих прямоугольников # разного цвета для каждого класса CLASSES = ["background", "aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"] # загружаем сериализованную модель Caffe с диска print("[INFO] loading model. ") net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])
Объект ImageHub используется сервером для приема подключений от каждой платы Raspberry Pi. По существу, для получения кадров по сети и отправки назад подтверждений здесь используются сокеты и ZMQ .
Предположим, что в системе безопасности мы отслеживаем только три класса подвижных объектов: собаки, люди и автомобили. Эти метки мы запишем в множество CONSIDER , чтобы отфильтровать прочие неинтересные нам классы (стулья, растения и т. д.).
Кроме того, необходимо следить за активностью клиентов, проверяя время отправки тем или иным клиентом последнего кадра.
# инициализируем выбранный набор подсчитываемых меток классов, # словарь-счетчик и словарь фреймов CONSIDER = set(["dog", "person", "car"]) objCount = frameDict = <> # инициализируем словарь, который будет содержать информацию # о том когда устройство было активным в последний раз lastActive = <> lastActiveCheck = datetime.now() # храним ожидаемое число клиентов, период активности # вычисляем длительность ожидания между проверкой # на активность устройства ESTIMATED_NUM_PIS = 4 ACTIVE_CHECK_PERIOD = 10 ACTIVE_CHECK_SECONDS = ESTIMATED_NUM_PIS * ACTIVE_CHECK_PERIOD # назначаем ширину и высоту монтажного кадра # чтобы просматривать потоки от всех клиентов вместе mW = args["montageW"] mH = args["montageH"] print("[INFO] detecting: <>. ".format(", ".join(obj for obj in CONSIDER)))
Далее необходимо зациклить потоки, поступающие от клиентов и обработку данных на сервере.
# начинаем цикл по всем кадрам while True: # получаем имя клиента и кадр, # подтверждаем получение (rpiName, frame) = imageHub.recv_image() imageHub.send_reply(b'OK') # если устройства нет в словаре lastActive, # это новое подключенное устройство if rpiName not in lastActive.keys(): print("[INFO] receiving data from <>. ".format(rpiName)) # записываем время последней активности для устройства, # от которого мы получаем кадр lastActive[rpiName] = datetime.now()
Итак, сервер забирает изображение в imageHub , высылает клиенту сообщение о подтверждении получения. Принятое сервером сообщение imageHub.recv_image содержит имя хоста rpiName и кадр frame . Остальные строки кода нужны для учета активности клиентов.
Затем мы работаем с кадром, формируя блоб (о функции blobFromImage читайте подробнее в посте pyimagesearch). Блоб передается нейросети для детектирования объектов.
Замечание: мы продолжаем рассматривать цикл, поэтому здесь и далее будьте внимательны с отступами в коде.
# изменяем размер кадра, чтобы ширина была не больше 400 пикселей, # захватываем размеры кадров и создаем блоб frame = imutils.resize(frame, width=400) (h, w) = frame.shape[:2] blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 0.007843, (300, 300), 127.5) # передаем блоб нейросети, получаем предсказания net.setInput(blob) detections = net.forward() # сбрасываем число объектов для интересующего набора objCount =
Теперь мы хотим пройтись по детектированным объектам, чтобы посчитать и выделить их цветными рамками:
# циклически обходим детектированные объекты for i in np.arange(0, detections.shape[2]): # извлекаем вероятность соответствующего предсказания confidence = detections[0, 0, i, 2] # отфильтруем слабые предсказания, # гарантируя минимальную достоверность if confidence > args["confidence"]: # извлекаем индекс метки класса idx = int(detections[0, 0, i, 1]) # проверяем, что метка класса в множестве интересных нам if CLASSES[idx] in CONSIDER: # подсчитываем детектированный объект objCount[CLASSES[idx]] += 1 # вычисляем координаты рамки, ограничивающей объект box = detections[0, 0, i, 3:7] * np.array([w, h, w, h]) (startX, startY, endX, endY) = box.astype("int") # рисуем рамку вокруг объекта cv2.rectangle(frame, (startX, startY), (endX, endY), (255, 0, 0), 2)
Далее, аннотируем каждый кадр именем хоста и количеством объектов. Наконец, монтируем из нескольких кадров общую панель:
# отобразим имя клиента на кадре cv2.putText(frame, rpiName, (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2) # отобразим число объектов на кадре label = ", ".join("<>: <>".format(obj, count) for (obj, count) in objCount.items()) cv2.putText(frame, label, (10, h - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255,0), 2) # обновим кадр в словаре кадров клиентов frameDict[rpiName] = frame # построим общий кадр из словаря кадров montages = build_montages(frameDict.values(), (w, h), (mW, mH)) # покажем смонтированный кадр на экране for (i, montage) in enumerate(montages): cv2.imshow("Home pet location monitor (<>)".format(i), montage) # детектируем нажатие какой-либо клавиши key = cv2.waitKey(1) & 0xFF
Остался заключительный блок для проверки последних активностей всех клиентов. Эти операции особенно важны в системах безопасности, чтобы при отключении клиента вы не наблюдали неизменный последний кадр.
# если разница между текущим временем и временем последней активности # больше порога, производим проверку if (datetime.now() - lastActiveCheck).seconds > ACTIVE_CHECK_SECONDS: # циклично обходим все ранее активные устройства for (rpiName, ts) in list(lastActive.items()): # удаляем клиент из словарей кадров и последних активных # если устройство неактивно if (datetime.now() - ts).seconds > ACTIVE_CHECK_SECONDS: print("[INFO] lost connection to <>".format(rpiName)) lastActive.pop(rpiName) frameDict.pop(rpiName) # устанавливаем время последней активности lastActiveCheck = datetime.now() # если нажата клавиша `q`, выходим из цикла if key == ord("q"): break # закрываем окна и освобождаем память cv2.destroyAllWindows()
Запускаем стриминг видео с камер
Теперь, когда мы реализовали и клиент, и сервер, проверим их. Загрузим клиент на каждую плату Raspberry Pi с помощью SCP-протокола:
$ scp client.py pi@192.168.1.10:~ $ scp client.py pi@192.168.1.11:~ $ scp client.py pi@192.168.1.12:~ $ scp client.py pi@192.168.1.13:~
Проверьте, что на всех машинах установлены импортируемые клиентом или сервером библиотеки. Первым нужно запускать сервер. Сделать это можно следующей командой:
$ python server.py --prototxt MobileNetSSD_deploy.prototxt \ --model MobileNetSSD_deploy.caffemodel --montageW 2 --montageH 2
Далее запускаем клиенты, следуя инструкции (будьте внимательны, в вашей системе имена и адреса могут отличаться):
- Откройте SSH-соединение с клиентом: ssh pi@192.168.1.10
- Запустите экран клиента: screen
- Перейдите к профилю: source ~/.profile
- Активируйте окружение: workon py3cv4
- Установите ImageZMQ, следуя инструкциям библиотеки по установке
- Запустите клиент: python client.py —server-ip 192.168.1.5
Ниже представлено демо-видео панели с процессом стриминга и распознавания объектов с четырех камер на Raspberry Pi.
Аналогичные решения из кластера камер и сервера можно использовать и для других задач, например:
- Распознавание лиц. Такую систему можно использовать в школах для обеспечения безопасности и автоматической оценки посещаемости.
- Робототехника. Объединяя несколько камер и компьютерное зрение, вы можете создать прототип системы автопилота.
- Научные исследования. Кластер из множества камер позволяет проводить исследования миграции птиц и животных. При этом можно автоматически обрабатывать фотографии и видео только в случае детектирования конкретного вида, а не просматривать видеопоток целиком.
