Этот проект посвящен обнаружению и отслеживанию объектов на основе формы с помощью OpenCV на одноплатном компьютере Raspberry Pi 4.
В мире компьютерного зрения отслеживание объектов является важнейшей задачей, которая включает в себя мониторинг перемещения определенных объектов с течением времени с помощью камеры. Отслеживание объектов на основе формы — это метод, который распознает и отслеживает объекты на основе их геометрических форм. OpenCV, библиотека компьютерного зрения с открытым исходным кодом, предоставляет широкий спектр функций, которые делают эту форму отслеживания как осуществимой, так и эффективной.
Сочетание этого с Raspberry Pi, компактным и доступным мини-компьютером, известным своей адаптивностью в проектах DIY (сделай сам), создает мощную комбинацию. Запустив OpenCV на Raspberry Pi, как любители, так и профессионалы могут создавать системы слежения в реальном времени без значительных инвестиций в оборудование. От наблюдения и робототехники до интерактивных художественных инсталляций, отслеживание объектов на основе формы с OpenCV на Raspberry Pi предлагает инновационные решения в различных областях.
Необходимые компоненты
- Плата Raspberry Pi 4 Model B (или другая) (купить на AliExpress).
- Камера для Raspberry Pi (купить на AliExpress).
- SD-карта 16/32 ГБ.
- Адаптер постоянного тока 5 В, 3 А для RPi.
- ЖК-дисплей (опционально).
- Мышь и клавиатура (опционально).
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Подключение камеры Raspberry Pi
Raspberry Pi Camera — периферийное устройство, разработанное Raspberry Pi Foundation для использования с серией одноплатных компьютеров Raspberry Pi. Модуль камеры позволяет добавлять возможности видео/фотосъемки в проекты Raspberry Pi.
Для этого проекта мы можем использовать 5-мегапиксельную камеру Raspberry Pi.
Просто подключите модуль камеры к плате Raspberry Pi 4 с помощью разъема камеры.
Чтобы использовать камеру, вам нужно сначала включить модуль камеры. Откройте Raspberry Pi Configuration Tool, введя sudo raspi-config
в терминале. Перейдите к Interfacing Options
> Camera
и включите его.
Настройка Raspberry Pi, установка библиотек и зависимостей
OpenCV требуется для обнаружения и отслеживания объектов и других задач обработки изображений, присутствующих в коде. Поэтому вам нужно сначала установить OpenCV. Следуйте следующему руководству, чтобы установить OpenCV в вашей системе:
1 |
pip3 install picamera |
Настройка завершена. Теперь мы можем перейти к нашему проекту.
Код Python для Raspberry Pi для отслеживания объектов с помощью OpenCV
Теперь давайте разработаем код Python, который поможет в отслеживании объектов на основе формы с помощью библиотеки OpenCV и камеры Raspberry Pi 4.
Код Python
Откройте Thonny IDE и вставьте следующий код в редактор Thonny. Сохраните этот файл с любым именем, например «Object_Tracking.py», в любом месте.
Вот полный код Python.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
import cv2 import numpy as np import time CAMERA_DEVICE_ID = 0 IMAGE_WIDTH = 320 IMAGE_HEIGHT = 240 fps = 0 def set_camera_properties(cap, width, height): """ Set resolution properties for the camera """ cap.set(3, width) cap.set(4, height) def capture_frame(cap): """ Capture a frame from the video source """ ret, frame = cap.read() if not ret: raise ValueError("Failed to read a frame from the camera") return frame def detect_circles(gray_frame): """ Detect circles using Hough transform and return the circles found """ return cv2.HoughCircles(gray_frame, cv2.HOUGH_GRADIENT, 1.2, 100) def process_frame(frame): """ Blur, convert to grayscale and detect circles """ frame = cv2.blur(frame, (3, 3)) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) circles = detect_circles(gray) return frame, gray, circles def draw_circles_on_frame(frame, circles): """ Draw circles and center rectangles on the given frame """ output = frame.copy() if circles is not None: circles = np.round(circles[0, :]).astype("int") for (x, y, r) in circles: cv2.circle(output, (x, y), r, (0, 255, 0), 4) cv2.rectangle(output, (x - 5, y - 5), (x + 5, y + 5), (0, 128, 255), -1) return output def visualize_fps(image, fps: float) -> np.ndarray: """Overlay the FPS value onto the given image.""" if len(np.shape(image)) < 3: text_color = (255, 255, 255) # white else: text_color = (0, 255, 0) # green row_size = 20 # pixels left_margin = 24 # pixels font_size = 1 font_thickness = 1 fps_text = 'FPS: {:.1f}'.format(fps) text_location = (left_margin, row_size) cv2.putText(image, fps_text, text_location, cv2.FONT_HERSHEY_PLAIN, font_size, text_color, font_thickness) return image def main(): try: cap = cv2.VideoCapture(CAMERA_DEVICE_ID) if not cap.isOpened(): raise ValueError("Could not open the camera") set_camera_properties(cap, IMAGE_WIDTH, IMAGE_HEIGHT) print("Press 'Esc' to exit...") fps = 0 # Initialize the fps variable while True: start_time = time.time() frame = capture_frame(cap) frame, _, circles = process_frame(frame) output = draw_circles_on_frame(frame, circles) end_time = time.time() seconds = end_time - start_time fps = 1.0 / seconds # Overlay FPS and display frames cv2.imshow("Frame", np.hstack([visualize_fps(frame, fps), visualize_fps(output, fps)])) if cv2.waitKey(33) == 27: # Escape key break except Exception as e: print(e) finally: cv2.destroyAllWindows() cap.release() if __name__ == "__main__": main() |
Объяснение работы кода
Давайте разберем код на разделы и объясним каждый из них:
1 2 3 |
import cv2 import numpy as np import time |
Эти строки импортируют необходимые библиотеки. cv2
предназначена для функций OpenCV, numpy
обеспечивает поддержку массивов и матриц и time
используется для операций синхронизации.
1 2 3 4 |
CAMERA_DEVICE_ID = 0 IMAGE_WIDTH = 320 IMAGE_HEIGHT = 240 fps = 0 |
Здесь определяются константы и переменные, CAMERA_DEVICE_ID
- указывается используемая камера, IMAGE_WIDTH
и IMAGE_HEIGHT
задают разрешение видео, а fps
- это переменная числа кадров в секунду.
1 2 3 4 |
def set_camera_properties(cap, width, height): """ Set resolution properties for the camera """ cap.set(3, width) cap.set(4, height) |
Эта функция устанавливает разрешение камеры. cap.set()
- это метод используется для изменения свойств камеры, где 3
и 4
являются идентификаторами свойств для ширины и высоты соответственно.
1 2 3 4 5 6 |
def capture_frame(cap): """ Capture a frame from the video source """ ret, frame = cap.read() if not ret: raise ValueError("Failed to read a frame from the camera") return frame |
Эта функция захватывает кадр с камеры. Если кадр не был успешно захвачен, возникает ошибка.
1 2 3 |
def detect_circles(gray_frame): """ Detect circles using Hough transform and return the circles found """ return cv2.HoughCircles(gray_frame, cv2.HOUGH_GRADIENT, 1.2, 100) |
Эта функция обнаруживает круги в кадре в оттенках серого с помощью преобразования Хафа.
1 2 3 4 5 6 |
def process_frame(frame): """ Blur, convert to grayscale and detect circles """ frame = cv2.blur(frame, (3, 3)) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) circles = detect_circles(gray) return frame, gray, circles |
Эта функция обрабатывает кадр, размывая его, преобразуя в оттенки серого и обнаруживая круги.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
def main(): try: cap = cv2.VideoCapture(CAMERA_DEVICE_ID) ... while True: ... frame = capture_frame(cap) frame, _, circles = process_frame(frame) ... if cv2.waitKey(33) == 27: # Escape key break except Exception as e: print(e) finally: cv2.destroyAllWindows() cap.release() |
Функция main()
является основной функцией программы. Она инициализирует камеру, устанавливает ее свойства и входит в цикл для захвата, обработки и отображения кадров. Цикл продолжается до тех пор, пока не будет нажата клавиша «Esc». Если возникают какие-либо исключения, они выводятся на печать, и программа переходит к фазе очистки, где все окна OpenCV уничтожаются, а камера освобождается.
1 2 |
if __name__ == "__main__": main() |
Это условие проверяет, выполняется ли скрипт как отдельная программа (не импортируется как модуль). Если true, функция main()
выполняется.
Тестирование работы проекта
Теперь нам нужно запустить код для отслеживания объектов на основе формы с помощью OpenCV на Raspberry Pi.
После запуска кода появятся 2 окна. В первом окне будет показано изображение с камеры. Во втором окне будет показан отслеживаемый объект.
Во втором окне круглый объект обнаруживается и отслеживается с помощью функции HoughCircles().
Вы можете поднести к камере любой круглый предмет. На внешней поверхности круга появится зеленый круг.
Заключение
Подводя итог, можно сказать, что проект объединяет возможности OpenCV в отслеживании объектов на основе формы с компактностью и экономичностью Raspberry Pi 4. Такое сочетание позволяет эффективно контролировать объекты на основе их геометрических форм в режиме реального времени. Это практичное решение для различных приложений, от наблюдения до художественных инсталляций, делая передовое компьютерное зрение доступным как для энтузиастов, так и для профессионалов.
14 просмотров