在较高级别,我正在尝试实现一种视频稳定算法,该算法利用线性编程来找到最佳路径。开头我对线性编程和python所做的工作几乎一无所知,因此欢迎任何批评。
视频长度为n帧,我有一个3x3矩阵的n-1列表 F ,描述了摄像机在帧之间的平移和旋转
我想通过在原始图像的边界内获取一个裁剪窗口并通过另一个3x3齐次变换矩阵对其进行变换,以使此新的最佳路径的运动不像原始的那样不稳定,从而稳定路径。
该算法致力于通过最小化F(t + 1)xB(t + 1)-B(t)的L1-范数来解决此问题... F = 3x3均匀变换矩阵的列表,描述视频中的逐帧过渡 B =应用于F以平滑路径的3x3齐次变换矩阵的列表 t =给定的帧转换(总共n-1个帧转换)
到目前为止,我唯一要应用的约束条件是裁剪窗口的角(占整个帧的75%,最初位于图像的中心)在原始帧的边界内
更正式。
Minimize L1-Norm( F[t+1]B[t+1] - B[t] ):
with respect to B = (B1, B2,... Bn)
where B[t] = [a b c]
[c d e]
[0 0 1]
F[t] = [cos(theta) -sin(theta) dx]
[sin(theta) cos(theta dy]
[0 0 1]
and F[t] is known
subject to:
(0,0)^T <= CR[i]B[t] <= (width, height)^T
where CR is list of matrices representing a corner
现在,我的纸浆铺设问题正在解决这个问题,因此可以由纸浆溶解器解决。我主要阅读this guide的本能如下
prob = LpProblem("find best sequence of B", LpMinimize)
frame_transitions = np.linspace(1, len(F), len(F))
B = LpVariable.dicts("B_vars", frame_transitions)
prob += lpSum( [abs( np.matmul(F[t+1], B[t+1]) - B[t] ) for t in range(1, len(frame_transitions))] )
prob += lpSum( [ np.matmul(CR[0], B[t]) ] for t in range(1, len(frame_transitions))] ) <= [width, height]
prob += lpSum( [ np.matmul(CR[0], B[t]) ] for t in range(1, len(frame_transitions))] ) >= [0, 0]
#constraint for upper left corner, repeat same process for corners 1,2,3
显然这是行不通的,因为LpVariable.dicts并没有为B中的每个条目设置一个矩阵,因此我不确定该如何实现。添加主要操作和约束函数时,是否应该为B中的6个自由度中的每个自由度创建一个变量并将它们组合成矩阵?