Неделя 9 - Работа с видео и трекинг объектов
1. Основы работы с видео в OpenCV
1.1. Захват видео с камеры
python
Copy
import cv2
# Инициализация видеозахвата (0 - встроенная камера)
cap = cv2.VideoCapture(0)
while True:
# Чтение кадра
ret, frame = cap.read()
# Если кадр считан успешно
if ret:
# Обработка кадра (например, преобразование в grayscale)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Отображение кадра
cv2.imshow('Camera Feed', gray)
# Выход по нажатию 'q'
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# Освобождение ресурсов
cap.release()
cv2.destroyAllWindows()
1.2. Работа с видеофайлами
python
Copy
# Открытие видеофайла
cap = cv2.VideoCapture('video.mp4')
# Получение свойств видео
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# Создание VideoWriter для сохранения результата
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, fps, (width, height))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# Обработка кадра
processed_frame = process_frame(frame)
# Запись кадра
out.write(processed_frame)
cv2.imshow('Processed Video', processed_frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
out.release()
cv2.destroyAllWindows()
2. Методы трекинга объектов
2.1. Оптический поток (Lucas-Kanade)
python
Copy
# Параметры для ShiTomasi corner detection
feature_params = dict(maxCorners=100,
qualityLevel=0.3,
minDistance=7,
blockSize=7)
# Параметры для Lucas-Kanade optical flow
lk_params = dict(winSize=(15,15),
maxLevel=2,
criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
# Инициализация
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)
p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params)
while True:
ret, frame = cap.read()
if not ret:
break
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Расчет оптического потока
p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)
# Визуализация
good_new = p1[st==1]
good_old = p0[st==1]
for i,(new,old) in enumerate(zip(good_new, good_old)):
a,b = new.ravel()
c,d = old.ravel()
frame = cv2.line(frame, (a,b), (c,d), (0,255,0), 2)
frame = cv2.circle(frame, (a,b), 5, (0,0,255), -1)
cv2.imshow('Optical Flow', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Обновление предыдущего кадра и точек
old_gray = frame_gray.copy()
p0 = good_new.reshape(-1,1,2)
2.2. Трекеры OpenCV
python
Copy
# Список доступных трекеров
trackers = {
'BOOSTING': cv2.legacy.TrackerBoosting_create,
'MIL': cv2.TrackerMIL_create,
'KCF': cv2.TrackerKCF_create,
'CSRT': cv2.TrackerCSRT_create
}
# Инициализация трекера
tracker = trackers['CSRT']()
bbox = cv2.selectROI("Select Object", frame, False)
tracker.init(frame, bbox)
while True:
ret, frame = cap.read()
if not ret:
break
# Обновление трекера
success, bbox = tracker.update(frame)
# Отрисовка bounding box
if success:
x, y, w, h = [int(v) for v in bbox]
cv2.rectangle(frame, (x,y), (x+w,y+h), (0,255,0), 2)
else:
cv2.putText(frame, "Tracking failure", (100,80),
cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0,0,255), 2)
cv2.imshow('Tracking', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
3. Детекция и трекинг движущихся объектов
3.1. Фоновая субтракция
python
Copy
# Инициализация методов фоновой субтракции
# mog2 = cv2.createBackgroundSubtractorMOG2()
knn = cv2.createBackgroundSubtractorKNN()
while True:
ret, frame = cap.read()
if not ret:
break
# Применение фоновой субтракции
fg_mask = knn.apply(frame)
# Улучшение маски
fg_mask = cv2.morphologyEx(fg_mask, cv2.MORPH_OPEN, kernel)
# Нахождение контуров
contours, _ = cv2.findContours(fg_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Отрисовка bounding box для крупных контуров
for cnt in contours:
if cv2.contourArea(cnt) > 500:
x,y,w,h = cv2.boundingRect(cnt)
cv2.rectangle(frame, (x,y), (x+w,y+h), (0,255,0), 2)
cv2.imshow('Original', frame)
cv2.imshow('Foreground Mask', fg_mask)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
4. Практическое задание
1. Реализуйте захват видео с веб-камеры с отображением в градациях серого
2. Примените оптический поток для трекинга характерных точек
3. Сравните разные трекеры (CSRT, KCF, MOSSE) на одном видео
4. Реализуйте детекцию движущихся объектов с помощью фоновой субтракции
5. Создайте простую систему подсчета людей/объектов в видео
5. Итоги
OpenCV предоставляет удобные инструменты для работы с видео
Оптический поток эффективен для трекинга характерных точек
Специальные трекеры (CSRT, KCF) обеспечивают устойчивое слежение
Фоновая субтракция полезна для детекции движущихся объектов
Комбинация методов дает лучшие результаты в сложных сценах
Следующая тема: Калибровка камеры и 3D реконструкция