全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析与数据挖掘
1811 0
2020-12-03
在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的输出光流
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群