Неделя 8 - Детекция и распознавание объектов
1. Детекция объектов по шаблону
1.1. Метод сопоставления шаблонов (Template Matching)
python
Copy
import cv2
import numpy as np
# Загрузка основного изображения и шаблона
img = cv2.imread('main_image.jpg', 0)
template = cv2.imread('template.jpg', 0)
w, h = template.shape[::-1]
# Применение template matching
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where(res >= threshold)
# Разметка найденных совпадений
for pt in zip(*loc[::-1]):
cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0,255,255), 2)
1.2. Методы сравнения
cv2.TM_CCOEFF - корреляция
cv2.TM_CCOEFF_NORMED - нормированная корреляция (лучший вариант)
cv2.TM_SQDIFF - квадрат разницы
2. Детекция объектов по цвету
2.1. Цветовые гистограммы
python
Copy
# Вычисление гистограммы для объекта
roi = cv2.imread('object.jpg')
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
roi_hist = cv2.calcHist([hsv_roi], [0, 1], None, [180, 256], [0, 180, 0, 256])
# Нормализация гистограммы
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)
2.2. Поиск по гистограмме
python
Copy
# Применение гистограммы к новому изображению
target = cv2.imread('search_image.jpg')
hsv = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)
dst = cv2.calcBackProject([hsv], [0, 1], roi_hist, [0, 180, 0, 256], 1)
# Улучшение результата
disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
cv2.filter2D(dst, -1, disc, dst)
_, thresh = cv2.threshold(dst, 50, 255, 0)
thresh = cv2.merge((thresh, thresh, thresh))
result = cv2.bitwise_and(target, thresh)
3. Детекторы объектов
3.1. Детектор Хаара (Haar Cascades)
python
Copy
# Загрузка предобученного классификатора
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# Детекция лиц
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)
3.2. HOG + SVM детектор
python
Copy
# Инициализация детектора людей
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
# Детекция людей
boxes, weights = hog.detectMultiScale(img, winStride=(4,4), padding=(8,8), scale=1.05)
4. Современные методы (Deep Learning)
4.1. Использование предобученных моделей
python
Copy
# Загрузка модели MobileNet SSD
net = cv2.dnn.readNetFromCaffe('deploy.prototxt', 'model.caffemodel')
# Подготовка изображения
blob = cv2.dnn.blobFromImage(cv2.resize(img, (300,300)), 0.007843, (300,300), 127.5)
# Прямой проход по сети
net.setInput(blob)
detections = net.forward()
# Обработка результатов
for i in range(detections.shape[2]):
confidence = detections[0, 0, i, 2]
if confidence > 0.5:
box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
(startX, startY, endX, endY) = box.astype("int")
cv2.rectangle(img, (startX, startY), (endX, endY), (0,255,0), 2)
5. Практическое задание
1. Реализуйте поиск шаблона на изображении
2. Постройте цветовую гистограмму объекта и найдите его на новом изображении
3. Обнаружьте лица на фотографии с помощью каскадов Хаара
4. Попробуйте детекцию людей с HOG дескриптором
5. (Дополнительно) Используйте нейросетевую модель для детекции объектов
6. Итоги
Template Matching - простой метод для поиска шаблонов
Цветовые гистограммы эффективны для объектов с уникальным цветом
Каскады Хаара - классический метод для детекции лиц
HOG + SVM подходит для детекции людей
Нейронные сети дают наилучшие результаты
Следующая тема: Работа с видео и трекинг объектов