|
在Python中实现Lucas-Kanade光流算法 在本文中,将描述Lucas-Kanade光流算法的实现。这个问题在UCSD的计算机视觉课程中作为作业出现。输入将是图像序列(视频的后续帧),并且算法将输出光流场(u,v)并跟踪运动对象的运动。问题描述来自作业本身。 问题陈述 单刻度光流 让我们实现单尺度Lucas-Kanade光流算法。这涉及到寻找运动(U,V)的是最小化 的平方和误差的的亮度恒定方程对于每个像素在一个窗口。该算法将通过以下输入实现为函数: def Optical_flow(I1,I2,window_size,tau)#返回(u,v) 这里,u和v是光流的x和y分量,I1和I2是分别在时间t = 1和t = 2时拍摄的两个图像,并且window_size是存储窗口宽度和高度的1×2向量在流量计算中使用。 除这些输入外,还应添加一个阈值τ,以便如果τ大于A'A的最小特征值,则不应计算该位置的光流。回想一下,光流仅在以下区域有效 f18.png 具有等级2,这是阈值正在检查的内容。τ的典型值为0.01。 我们应该尝试用不同的窗口大小进行试验,并找出使用小窗口大小还是大窗口大小的权衡。 下图描述了该算法,该算法考虑了每个像素周围的nxn(n> = 3)窗口,并解决了最小二乘问题,以找到该像素的最佳流矢量。 f19.png 以下代码段显示了如何在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 import numpy as np from scipy import signal def optical_flow(I1g kernel_x = np.array([[-1. kernel_y = np.array([[-1. kernel_t = np.array([[1. w = window_size/2 # window_size is odd I1g = I1g / 255. # normalize pixels I2g = I2g / 255. # normalize pixels # Implement Lucas Kanade # for each point mode = 'same' fx = signal.convolve2d(I1g fy = signal.convolve2d(I1g ft = signal.convolve2d(I2g signal.convolve2d(I1g u = np.zeros(I1g.shape) v = np.zeros(I1g.shape) # within window window_size * window_size for i in range(w for j in range(w Ix = fx[i-w:i+w+1 Iy = fy[i-w:i+w+1 It = ft[i-w:i+w+1 #b = ... # get b here #A = ... # get A here # if threshold τ is larger than the smallest eigenvalue of A'A: nu = ... # get velocity here u[i v[i return (u 一些结果 下图和动画显示了一些图像序列上算法的结果。这些输入图像序列/视频中的一些来自课程,一些来自互联网。 可以看出,如果连续帧之间的运动对象的运动很慢,则算法的效果最佳。相反,如果运动较大,则算法将失败,我们应该实现/使用带有图像金字塔的多尺度版本Lucas-Kanade。 最后,在小窗口大小的情况下,该算法可以捕获细微的运动,但不能捕获大的运动。大尺寸的情况则相反。 输入序列 领域 shpere_cmap_15 具有不同窗口尺寸的输出光流 视窗大小= 15 shpere_opt_15 视窗大小= 21 shpere_opt_21 输入序列 红宝石 输出光流 rubic_opt rubic_cmap 输入序列(汉堡出租车) 出租车 taxi_cmap 输出光流 taxi_opt 输入序列 框 box_cmap 输出光流 box_opt 输入序列 序列 seq_cmap 输出光流seq_opt 输入序列 fount3.gif fount_cmap 输出光流fount_opt 输入序列 走廊 输出光流 skyline_optc 输入序列合成器 synth'_cmap 输出光流synth_opt 输入序列汽车1 输出光流cars1_optcars1_cmap 输入序列汽车2 输出光流cars2_opt 输出光流cars2_opt2cars2_cmap 输入序列 carsh.gif cars3_cmap 窗口大小为45的输出光流 cars3_opt.gif 窗口大小为10的输出光流 cars3_opt2_10 窗口大小为25的 cars3_opt2_25 输出光流窗口大小为45的输出光流 题库 (责任编辑:蚂蚁团队) |
