我正在尝试建立一个能够检测足球视频序列越位情况的程序。为了追踪更好的球员和球,我需要估计连续帧之间的单应性。我在Matlab做这个项目。 我能够在帧之间找到足够的相应线条,但在我看来,由此产生的单应性不正确。
我从以下情况开始,我有这两个处理过的图像(1280x720像素)和相应的行: image 1和image 2。
线来自霍夫变换并且具有cross(P1, P2)
形式,其中P(i)是[x y 1]'
,其中0 <0。 x,y&lt; 1(由图像宽度和高度分开)。线也被归一化,由第三个分量划分。)
在线规范化之前(刚交叉产品之后)我有:
第1帧的行(每行一行)。
[ -0.9986 -0.2992 0.6792
-0.9986 -0.4305 0.5686
-0.8000 -0.4500 0.3613
-0.9986 -0.1609 0.7890
-0.9986 -0.0344 0.9074
-0.2500 -0.2164 0.0546]
这些是第2帧的行:
[-0.9986 -0.2984 0.6760
-0.9986 -0.4313 0.5678
-0.7903 -0.4523 0.3587
-0.9986 -0.1609 0.7890
-0.9986 -0.0391 0.9066
-0.2486 -0.2148 0.0539]
对每个数学线进行归一化(在这种情况下所有行都对应)我创建矩阵A(j)
[-u 0 u*x -v 0 v*x -1 0 x];
[0 -u u*y 0 -v v*y 0 -1 y];
其中line(j)_1是[x y 1]'
而line(j)_2是[u v 1]'
。然后我形成整个矩阵A并计算SVD
[~,~,V] = svd(A);
。将V的最后一列重新排列为3x3矩阵将使H为:
[0.4234 0.0024 -0.3962
-0.3750 -0.0030 0.3503
0.4622 0.0029 -0.4322]
这个单应矩阵对于上面的平行线和消失点(这些线的交点)非常有效,但它在其他地方做得很糟糕。例如,一个消失点在未缩放的坐标(1194.2,-607.4)中,它应该保持在那里,实际上将映射几个像素(5~10px)。但是,如果我在(300,300)中随机点,将转到(1174.1,-582.7)!
我无法看到我是否犯了一些大错误,或者是因为测量中的噪音。你能救我吗?
答案 0 :(得分:1)
好吧,你计算了一个单应线映射到行。如果你想要相应的逐点单应性,你需要反转并转置它。例如,参见Hartley和Zisserman&#34;多视图几何&#34;的第1.3.1章。
答案 1 :(得分:0)
根据您发布的图像,您正在考虑的线条在场景中看起来都是相互平行的。然后问题是不适定的,因为有无数的单应性来解释由此产生的对应关系。尝试添加到具有其他方向的通信行。