Извлечение ограничивающей рамки — фундаментальная задача компьютерного зрения и обнаружения объектов. Он включает в себя идентификацию и локализацию объектов на изображении путем рисования вокруг них прямоугольников. OpenCV, популярная библиотека компьютерного зрения, предоставляет различные методы эффективного извлечения ограничивающих рамок. В этой статье мы рассмотрим несколько методов с примерами кода, которые помогут вам освоить извлечение ограничивающей рамки с помощью OpenCV в Python.
Метод 1: ограничивающие рамки на основе контуров.
Обнаружение контуров — широко используемый метод извлечения фигур из изображения. Определив контуры, мы можем получить ограничивающие рамки вокруг этих фигур. Вот пример фрагмента кода:
import cv2
# Load the image
image = cv2.imread('image.jpg')
# Convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Apply thresholding or any necessary preprocessing steps
# Find contours
contours, _ = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Extract bounding boxes
bounding_boxes = [cv2.boundingRect(c) for c in contours]
# Draw bounding boxes on the image
for bbox in bounding_boxes:
x, y, w, h = bbox
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
# Display the image with bounding boxes
cv2.imshow('Image with Bounding Boxes', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Метод 2: Сопоставление шаблонов
Сопоставление шаблонов полезно, когда у вас есть определенный шаблон объекта и вы хотите найти его экземпляры в изображении. Вот пример фрагмента кода, использующего сопоставление шаблонов для извлечения ограничивающих рамок:
import cv2
import numpy as np
# Load the image and template
image = cv2.imread('image.jpg')
template = cv2.imread('template.jpg')
# Convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
# Perform template matching
result = cv2.matchTemplate(gray, template_gray, cv2.TM_CCOEFF_NORMED)
# Set a threshold for matches
threshold = 0.8
locations = np.where(result >= threshold)
bounding_boxes = []
# Extract bounding boxes
for loc in zip(*locations[::-1]):
x, y = loc
w, h = template_gray.shape[::-1]
bounding_boxes.append((x, y, w, h))
# Draw bounding boxes on the image
for bbox in bounding_boxes:
x, y, w, h = bbox
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
# Display the image with bounding boxes
cv2.imshow('Image with Bounding Boxes', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Метод 3: обнаружение объектов с помощью предварительно обученных моделей
OpenCV также предоставляет предварительно обученные модели для обнаружения объектов, такие как каскады Хаара и модели на основе глубокого обучения, такие как YOLO («Вы смотрите только один раз») и SSD («Один снимок»). Мультибоксовый детектор). Эти модели могут обнаруживать различные объекты и предоставлять координаты ограничивающего прямоугольника. Вот пример использования каскадного классификатора Хаара:
import cv2
# Load the pre-trained Haar cascade
cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# Load the image
image = cv2.imread('image.jpg')
# Convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Detect objects using the cascade
objects = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# Extract bounding boxes
bounding_boxes = []
for (x, y, w, h) in objects:
bounding_boxes.append((x, y, w, h))
# Draw bounding boxes on the image
for bbox in bounding_boxes:
x, y, w, h = bbox
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
# Display the image with bounding boxes
cv2.imshow('Image with Bounding Boxes', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Извлечение ограничивающей рамки — важный шаг во многих приложениях компьютерного зрения. В этой статье мы рассмотрели три различных метода извлечения ограничивающих рамок с использованием OpenCV в Python. Подход на основе контуров, сопоставление шаблонов и обнаружение объектов с помощью предварительно обученных моделей обеспечивают универсальные решения для различных сценариев. Используя эти методы, вы можете точно локализовать объекты на изображениях и продвигать свои проекты компьютерного зрения.
Следуя этому подробному руководству, вы теперь изучили несколько методов извлечения ограничивающих рамок с помощью OpenCV в Python. Каждый метод имеет свои преимущества и области применения, что позволяет вам выбрать наиболее подходящий подход с учетом ваших конкретных требований. Если вам нужно обнаружить контуры, сопоставить шаблоны или использовать предварительно обученные модели, OpenCV предоставляет мощный набор инструментов для эффективного извлечения ограничивающей рамки.