Оптический поток – это фундаментальная концепция компьютерного зрения, которая предполагает оценку движения объектов в последовательности изображений. Он имеет различные приложения, включая отслеживание объектов, стабилизацию видео и анализ движения. В этой статье мы погрузимся в мир оптического потока и рассмотрим несколько популярных методов, реализованных на Python, а также примеры кода. Итак, начнём!
- Плотный оптический поток.
Методы плотного оптического потока вычисляют векторы движения для всех пикселей изображения. Одним из популярных подходов является метод Farneback, доступный в библиотеке OpenCV. Вот пример фрагмента кода:
import cv2
# Load two consecutive frames
frame1 = cv2.imread('frame1.jpg')
frame2 = cv2.imread('frame2.jpg')
# Convert frames to grayscale
prev_gray = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
next_gray = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
# Compute dense optical flow
flow = cv2.calcOpticalFlowFarneback(prev_gray, next_gray, None, 0.5, 3, 15, 3, 5, 1.2, 0)
# Visualize the optical flow
flow_visualized = cv2.cvtColor(prev_gray, cv2.COLOR_GRAY2BGR)
step = 10
for y in range(0, flow_visualized.shape[0], step):
for x in range(0, flow_visualized.shape[1], step):
dx, dy = flow[y, x]
cv2.arrowedLine(flow_visualized, (x, y), (int(x + dx), int(y + dy)), (0, 255, 0), 1)
# Display the results
cv2.imshow('Optical Flow', flow_visualized)
cv2.waitKey(0)
cv2.destroyAllWindows()
- Разреженный оптический поток.
Методы разреженного оптического потока отслеживают выбранный набор характерных точек в кадрах. Метод Лукаса-Канаде — широко используемый алгоритм для оценки разреженного оптического потока. Вот пример фрагмента кода:
import cv2
# Load two consecutive frames
frame1 = cv2.imread('frame1.jpg')
frame2 = cv2.imread('frame2.jpg')
# Convert frames to grayscale
prev_gray = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
next_gray = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
# Define feature points to track
feature_params = dict(maxCorners=100, qualityLevel=0.3, minDistance=7, blockSize=7)
prev_pts = cv2.goodFeaturesToTrack(prev_gray, mask=None, feature_params)
# Compute sparse optical flow
next_pts, status, _ = cv2.calcOpticalFlowPyrLK(prev_gray, next_gray, prev_pts, None)
# Filter out points with low status
good_pts = next_pts[status == 1]
good_prev_pts = prev_pts[status == 1]
# Visualize the optical flow
flow_visualized = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
for i, (next_pt, prev_pt) in enumerate(zip(good_pts, good_prev_pts)):
x1, y1 = prev_pt.ravel()
x2, y2 = next_pt.ravel()
cv2.arrowedLine(flow_visualized, (x1, y1), (x2, y2), (0, 255, 0), 1, cv2.LINE_AA)
# Display the results
cv2.imshow('Optical Flow', flow_visualized)
cv2.waitKey(0)
cv2.destroyAllWindows()
- Метод Хорна-Шунка:
Метод Хорна-Шунка представляет собой алгоритм оптического потока, который предполагает ограничения гладкости поля потока. Вот пример фрагмента кода с использованием библиотеки PyFlowLib:
import numpy as np
from pyflowlib import pyramid
# Load two consecutive frames
frame1 = cv2.imread('frame1.jpg')
frame2 = cv2.imread('frame2.jpg')
# Convert frames to grayscale
prev_gray = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
next_gray = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
# Compute optical flow using Horn-Schunck method
u, v = pyramid.HornSchunck(prev_gray.astype(np.float32) / 255., next_gray.astype(np.float32) / 255., alpha=100, verbose=False)
# Visualize the optical flow
flow_visualized = pyramid.flow_to_color(u, v)
cv2.imshow('Optical Flow', flow_visualized)
cv2.waitKey(0)
cv2.destroyAllWindows()
В этой статье мы рассмотрели различные методы оценки оптического потока в Python. Мы рассмотрели плотный оптический поток, используя метод Фарнебака, разреженный оптический поток, используя метод Лукаса-Канаде, и метод Хорна-Шунка, используя библиотеку PyFlowLib. Эти методы обеспечивают различные компромиссы между точностью и эффективностью вычислений, что делает их подходящими для различных приложений. Используя эти методы, вы сможете открыть потрясающие возможности компьютерного зрения, такие как отслеживание объектов, анализ движения и стабилизация видео.