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

cv2
OpenCV (Библиотека компьютерного зрения с открытым исходным кодом) - нестандартная библиотека компьютерного зрения, предоставляющая широкий спектр функций для обработки изображений и видео, обнаружения объектов, распознавания объектов и многого другого.
Базовый код для вывода видеопотока:
import cv2
cap = cv2.VideoCapture(0)
if not cap.isOpened():
    print("Error: Unable to open stream")
else:
    print("Stream opened successfully")
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        cv2.imshow("Stream", frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()Объяснение кода:
- Инициализация библиотек: 
import cv2cv2 - нестандартная библиотека python для работы с видеопотоком
- Инициализация камеры: 
cap = cv2.VideoCapture(0)
if not cap.isOpened():
    print("Error: Unable to open stream")
else:
    print("Stream opened successfully")Здесь в переменной cap инициализируется видеопоток (при значении 0 выводится изображение с внутреннего устройства вашего компьютера)
В условии прописано, что если видеопоток не открылся, выводится сообщение: Error: Unable to open stream, если видеопоток открылся: Stream opened successfully. Сообщения выводятся в терминал.
- Захват и отображение видеопотока: 
while True:
    ret, frame = cap.read()
    if not ret:
        break
    cv2.imshow("Stream", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        breakВ этом условии пока открыт видеопоток код будет получать значения с камеры с помощью cap.read() и показывать видеопоток благодаря cv2.imshow()
Установка библиотеки:
Так как библиотека не стандартная в Python, ее необходимо установить
- Откройте Visual Studio Code 

- Откройте терминал (Terminal -> New Terminal или комбинацией Ctrl+Shift+`) 


- Введите команду и установите библиотеку 
В терминал пропишите: pip install opencv-python


Запуск кода:
- Создайте файл и назовите его, например, cv2_lib.py 

- Скопируйте код в файл: 

- Запустите код: 
При запуске кода открывается отдельно окно с трансляцией видеопотока:

Ultralytics
Ultralytics - это мощная библиотека для компьютерного зрения и машинного обучения, которая позволяет легко работать с моделями YOLO (You Only Look Once) для обнаружения объектов на изображениях и видеопотоках.
YOLO - это алгоритм обнаружения объектов в реальном времени, который может обнаруживать объекты на изображении или видеопотоке и определять их класс (например: человек, машина, собака и т.д.). Ultralytics предоставляет готовые модели YOLO, которые можно использовать для обнаружения объектов на изображениях и видеопотоках.
Пример кода:
import cv2
from ultralytics import YOLO
model = YOLO('yolov8n.pt')
cap = cv2.VideoCapture(0)
while True:
    ret, frame = cap.read()
    if not ret:
        break
    results = model(frame)
    annotated_frame = results[0].plot()
    cv2.imshow('Detection', annotated_frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()Объяснение кода:
- Инициализация библиотек: - cv2: OpenCV (Компьютерное зрение) - нестандартная библиотека python для работы с видеопотоком. 
- ultralytics: Ultralytics - это библиотека для работы с моделями компьютерного зрения, такими как YOLO (You Only Look Once). Она позволяет легко использовать эти модели для детекции объектов на изображениях и видео. 
 
- Инициализация модели и видеопотока: 
model = YOLO('yolov8n.pt')
cap = cv2.VideoCapture(0)Здесь в переменную model мы инициализируем модель yolov8n.pt, в переменную cap - видеопоток с внутреннего устройства вашего компьютера
ПРИМЕЧАНИЕ: модель устанавливается самостоятельно с первым запуском кода, если после установки модели код завершил работу, запустите его снова.
- Открытие потока и работа нейросети по модели yolov8n.pt: 
while True:
    ret, frame = cap.read()
    if not ret:
        break
    results = model(frame)
    annotated_frame = results[0].plot()
    cv2.imshow('Detection', annotated_frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        breakЗдесь запускается чтение кадра с помощью переменной frame. Обработка модели происходит с помощью переменной results.
annotated_frame вырисовывает рамки и дает информацию об обнаруженном нейросетью объекте, далее уже обработанные кадры выводятся в окне видеопотока с рамками
Установка библиотеки:
Библиотека ultralytics не является предустановленной
- Откройте терминал (Terminal -> New Terminal или комбинацией Ctrl+Shift+`) 

- Введите команду: pip install ultralytics и подтвердите команду 

Запуск кода:
- Создайте файл с названием ultralytics_lib.py: 

- Скопируйте код в файл: 

- Запустите код: 

Как можно увидеть, в видеопотоке появились рамки распознавания. На кадре виден человек person, и телефон cell phone. В терминал выводится информация о найденных объектах.
Mediapipe
Mediapipe - это библиотека для работы с жестами в видеопотоке. Mediapipe позволяет реализовать различный функционал с помощью жестов. Процесс установки и работы с mediapipe:
- Установите библиотеку: 
Откройте Visual Studio Code и запустите терминал (Terminal -> New Terminal или комбинацией ctrl + shift + `)

Пропишите команду pip install mediapipe

- Проверьте работоспособность библиотеки 
import cv2
import numpy as np
import mediapipe as mp
import time
import os
# Подключаем камеру
cap = cv2.VideoCapture(0) 
cap.set(3, 640) # Width
cap.set(4, 480) # Lenght
cap.set(10, 100) # Brightness
mpHands = mp.solutions.hands
hands = mpHands.Hands(False)
npDraw = mp.solutions.drawing_utils
pTime = 0
cTime = 0
	
	#Зацикливаем получение кадров от камеры
while True: 
    success, img = cap.read()
    img = cv2.flip(img,1) # Mirror flip
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    results = hands.process(imgRGB)
    if results.multi_hand_landmarks:
        for handLms in results.multi_hand_landmarks:
            for id, lm in enumerate(handLms.landmark):
                h,w,c = img.shape
                cx, cy = int(lm.x*w), int(lm.y*h)
               # print(id, lm)
                if  id == 8 or id == 12:
                    cv2.circle(img, (cx,cy),10,(255,0,255),cv2.FILLED)
            
            npDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)
    
    cTime = time.time()
    fps = 1/(cTime-pTime)
    pTime = cTime
    cv2.putText(img, str(int(fps)),(10,30), cv2.FONT_HERSHEY_PLAIN, 2, (255,0,0), 2) # ФреймРейт
    
    cv2.imshow('python', img)
    if cv2.waitKey(20) == 27: # exit on ESC
        break
        
cv2.destroyWindow("python")
cap.release()
cv2.waitKey(1)- Импорт библиотек: - import cv2 import numpy as np import mediapipe as mp import time import os- Здесь мы импортируем необходимые библиотеки: - cv2: для работы с изображениями и видеопотоками (OpenCV).
- numpy: для работы с массивами.
- mediapipe: для обнаружения и отслеживания рук.
- time: для работы со временем (например, для расчета FPS).
- os: для работы с операционной системой (хотя в этом коде она не используется).
 
- Подключение к камере: - cap = cv2.VideoCapture(0) cap.set(3, 640) # Width cap.set(4, 480) # Length cap.set(10, 100) # Brightness- cv2.VideoCapture(0): открывает веб-камеру (0 - это индекс первой камеры).
- cap.set(3, 640)и- cap.set(4, 480): устанавливает ширину и высоту видеопотока.
- cap.set(10, 100): устанавливает яркость камеры.
 
- Инициализация MediaPipe: - mpHands = mp.solutions.hands hands = mpHands.Hands(False) npDraw = mp.solutions.drawing_utils- mpHands.Hands(False): создает объект для обнаружения рук. Параметр- Falseуказывает, что мы не хотим использовать модель для отслеживания жестов.
- npDraw: утилиты для рисования на изображениях (например, для отображения соединений между ключевыми точками рук).
 
- Основной цикл: - while True: success, img = cap.read() img = cv2.flip(img,1) # Mirror flip- В этом цикле происходит захват кадров с камеры. - cap.read()считывает кадр, а- cv2.flip(img, 1)переворачивает изображение по горизонтали (для эффекта зеркала).
- Обработка изображения: - imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) results = hands.process(imgRGB)- cv2.cvtColor(img, cv2.COLOR_BGR2RGB): преобразует изображение из формата BGR (который использует OpenCV) в RGB.
- hands.process(imgRGB): обрабатывает изображение и ищет руки.
 
- Отрисовка ключевых точек и соединений: - if results.multi_hand_landmarks: for handLms in results.multi_hand_landmarks: for id, lm in enumerate(handLms.landmark): h,w,c = img.shape cx, cy = int(lm.x*w), int(lm.y*h) if id == 8 or id == 12: cv2.circle(img, (cx,cy),10,(255,0,255),cv2.FILLED) npDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)- Если обнаружены руки, для каждой руки ( - handLms) мы проходим по всем ключевым точкам (- landmark).
- h, w, c = img.shape: получает высоту, ширину и количество каналов изображения.
- cxи- cy: вычисляют координаты ключевых точек на изображении.
- Если идентификатор ( - id) ключевой точки равен 8 или 12 (что соответствует указательному и среднему пальцам), то рисуем круг на этих точках.
- npDraw.draw_landmarks: рисует соединения между ключевыми точками руки.
 
- Расчет FPS: - cTime = time.time() fps = 1/(cTime-pTime) pTime = cTime cv2.putText(img, str(int(fps)),(10,30), cv2.FONT_HERSHEY_PLAIN, 2, (255,0,0), 2)- cTime = time.time(): получает текущее время.
- fps = 1/(cTime-pTime): вычисляет количество кадров в секунду (FPS).
- cv2.putText: отображает FPS на изображении.
 
- Отображение изображения: - cv2.imshow('python', img) if cv2.waitKey(20) == 27: # exit on ESC break- cv2.imshow('python', img): отображает текущее изображение в окне с названием 'python'.
- cv2.waitKey(20): ждет 20 миллисекунд нажатия клавиши. Если нажата клавиша ESC (код 27), цикл прерывается.
 
- Очистка ресурсов: - cv2.destroyWindow("python") cap.release() cv2.waitKey(1)- cv2.destroyWindow("python"): закрывает окно отображения.
- cap.release(): освобождает ресурсы, связанные с камерой.
- cv2.waitKey(1): дополнительная задержка для завершения работы.
 
Вывод:

Последнее обновление
