Прочие библиотеки 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()

Объяснение кода:

  1. Инициализация библиотек:

import cv2

cv2 - нестандартная библиотека python для работы с видеопотоком

  1. Инициализация камеры:

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. Сообщения выводятся в терминал.

  1. Захват и отображение видеопотока:

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, ее необходимо установить

  1. Откройте Visual Studio Code

Пустое окно VS Code
  1. Откройте терминал (Terminal -> New Terminal или комбинацией Ctrl+Shift+`)

Открытие терминала
Окно с открытым терминалом
  1. Введите команду и установите библиотеку

В терминал пропишите: pip install opencv-python

Команда установки библиотеки OpenCV
Процесс установки OpenCV в терминале

Запуск кода:

  1. Создайте файл и назовите его, например, cv2_lib.py

Файл cv2_lib.py в окне иерархии
  1. Скопируйте код в файл:

Окно программирования в файле cv2_lib.py
  1. Запустите код:

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

Результат работы кода

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()

Объяснение кода:

  1. Инициализация библиотек:

    1. cv2: OpenCV (Компьютерное зрение) - нестандартная библиотека python для работы с видеопотоком.

    2. ultralytics: Ultralytics - это библиотека для работы с моделями компьютерного зрения, такими как YOLO (You Only Look Once). Она позволяет легко использовать эти модели для детекции объектов на изображениях и видео.

  2. Инициализация модели и видеопотока:

model = YOLO('yolov8n.pt')

cap = cv2.VideoCapture(0)

Здесь в переменную model мы инициализируем модель yolov8n.pt, в переменную cap - видеопоток с внутреннего устройства вашего компьютера

ПРИМЕЧАНИЕ: модель устанавливается самостоятельно с первым запуском кода, если после установки модели код завершил работу, запустите его снова.

  1. Открытие потока и работа нейросети по модели 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 не является предустановленной

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

Открытие терминала
  1. Введите команду: pip install ultralytics и подтвердите команду

Команда в терминале

Запуск кода:

  1. Создайте файл с названием ultralytics_lib.py:

файл ultralytics_lib.py в окне иерархии
  1. Скопируйте код в файл:

Код в окне программирования файла ultralytics_lib.py
  1. Запустите код:

Результат запуска кода

Как можно увидеть, в видеопотоке появились рамки распознавания. На кадре виден человек person, и телефон cell phone. В терминал выводится информация о найденных объектах.

Mediapipe

Mediapipe - это библиотека для работы с жестами в видеопотоке. Mediapipe позволяет реализовать различный функционал с помощью жестов. Процесс установки и работы с mediapipe:

  1. Установите библиотеку:

Откройте Visual Studio Code и запустите терминал (Terminal -> New Terminal или комбинацией ctrl + shift + `)

Открытие терминала

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

Установка mediapipe
  1. Проверьте работоспособность библиотеки

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)
  1. Импорт библиотек:

    import cv2
    import numpy as np
    import mediapipe as mp
    import time
    import os

    Здесь мы импортируем необходимые библиотеки:

    • cv2: для работы с изображениями и видеопотоками (OpenCV).

    • numpy: для работы с массивами.

    • mediapipe: для обнаружения и отслеживания рук.

    • time: для работы со временем (например, для расчета FPS).

    • os: для работы с операционной системой (хотя в этом коде она не используется).

  2. Подключение к камере:

    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): устанавливает яркость камеры.

  3. Инициализация MediaPipe:

    mpHands = mp.solutions.hands
    hands = mpHands.Hands(False)
    npDraw = mp.solutions.drawing_utils
    • mpHands.Hands(False): создает объект для обнаружения рук. Параметр False указывает, что мы не хотим использовать модель для отслеживания жестов.

    • npDraw: утилиты для рисования на изображениях (например, для отображения соединений между ключевыми точками рук).

  4. Основной цикл:

    while True: 
        success, img = cap.read()
        img = cv2.flip(img,1) # Mirror flip

    В этом цикле происходит захват кадров с камеры. cap.read() считывает кадр, а cv2.flip(img, 1) переворачивает изображение по горизонтали (для эффекта зеркала).

  5. Обработка изображения:

    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    results = hands.process(imgRGB)
    • cv2.cvtColor(img, cv2.COLOR_BGR2RGB): преобразует изображение из формата BGR (который использует OpenCV) в RGB.

    • hands.process(imgRGB): обрабатывает изображение и ищет руки.

  6. Отрисовка ключевых точек и соединений:

    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: рисует соединения между ключевыми точками руки.

  7. Расчет 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 на изображении.

  8. Отображение изображения:

    cv2.imshow('python', img)
    if cv2.waitKey(20) == 27: # exit on ESC
        break
    • cv2.imshow('python', img): отображает текущее изображение в окне с названием 'python'.

    • cv2.waitKey(20): ждет 20 миллисекунд нажатия клавиши. Если нажата клавиша ESC (код 27), цикл прерывается.

  9. Очистка ресурсов:

    cv2.destroyWindow("python")
    cap.release()
    cv2.waitKey(1)
    • cv2.destroyWindow("python"): закрывает окно отображения.

    • cap.release(): освобождает ресурсы, связанные с камерой.

    • cv2.waitKey(1): дополнительная задержка для завершения работы.

Вывод:

Last updated