ФАЙЛ «ARUCO.PY»

ИНИЦИАЛИЗАЦИЯ БИБЛИОТЕК

import cv2
import sys
import socket
from cv2 import aruco
  • cv2: Библиотека OpenCV для обработки изображений и видео.

  • sys: Модуль для работы с параметрами командной строки и другими системными функциями.

  • socket: Модуль для сетевого взаимодействия.

  • cv2.aruco: Подмодуль для работы с маркерами Aruco.

ПОДКЛЮЧЕНИЕ К СЕРВЕРУ

if len(sys.argv) > 1:
    port_data = sys.argv[-1] 
    print(port_data)
    port_data = port_data.split(',')
    ports = port_data[0].split(':')
    rtsp_url = port_data[1]
    socks = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socks.connect((ports[0], int(ports[1])))
else:
    print("данных нет")
    exit()

Этот блок кода устанавливает подключение к серверу, используя данные, переданные через командную строку.

Процесс:

- Проверяет наличие аргументов командной строки.

- Извлекает данные о порте и URL RTSP-потока.

- Устанавливает сокетное соединение с сервером по указанному адресу и порту.

ИНИЦИАЛИЗАЦИЯ КАМЕРЫ И РАСПОЗНОВАНИЕ ARUCO

try:
    cap = cv2.VideoCapture(rtsp_url)
    aruco_dict = cv2.aruco.getPredefinedDictionary(aruco.DICT_4X4_100)
    parameters = aruco.DetectorParameters()

    while True:
        ret, frame = cap.read()
        if ret:
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

            corners, ids, rejectedImgPoints = aruco.detectMarkers(gray, aruco_dict, parameters=parameters)

            # Обрисовка обнаруженных маркеров ArUco
            if ids is not None:
                aruco.drawDetectedMarkers(frame, corners, ids)
                # Отправка данных через сокет, если необходимо
                socks.sendall(f"{ids.flatten().tolist()}".encode('utf-8'))
            else:
            #     # Отправка данных через сокет, если не обнаружено маркеров
                socks.sendall("null".encode())

            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
        else:
            print("Не удалось захватить изображение")
            break
        cv2.imshow('Frame with ArUco Markers', frame)
except Exception as e:
    pass

Этот блок кода отвечает за захват видео, обнаружение маркеров Aruco и их отрисовку на кадре.

Процесс:

- Инициализация видеопотока: Открывает RTSP-поток для захвата видео.

- Настройка словаря Aruco: Задает словарь для обнаружения маркеров.

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

  • Захват кадра из видеопотока.

  • Преобразование кадра в оттенки серого.

  • Обнаружение маркеров Aruco на кадре.

  • Отрисовка найденных маркеров на кадре.

  • Отправка данных о найденных маркерах на сервер через сокет.

  • Отображение кадра с нарисованными маркерами.

ЗАКРЫТИЕ ПОТОКОВ И СОЕДИНЕНИЙ

# закрытие потоков, окна камеры, и подключения к серверу
finally:
    cap.release()
    socks.close()
    cv2.destroyAllWindows()

Этот блок кода выполняется в любом случае (при нормальной работе или при возникновении исключения) и отвечает за закрытие всех открытых ресурсов.

Процесс подготовки кода:

  1. Создайте файл и назовите его aruco.py:

  1. Поэтапно копируйте части кода в ваш файл:

  1. Установка библиотек: в данном случае библиотека cv2 не предустановлена в python. Без неё мы не сможем работать с видеопотоком и обрабатывать AruCo метки. Если вы еще не установили эту библиотеку, то вот процесс установки библиотеки:

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

    2. В открывшимся терминале прописываем команду pip install opencv-python и нажимаем Enter

После установки библиотеки файл будет готов к работе, при запуске в консоль выводится "данных нет". Данный файл используется импортом для других файлов.

Last updated