如何检测图像中坐标的旋转角度

时间:2014-06-06 16:00:41

标签: algorithm image-processing motion-detection

我正在尝试用纺车来评估一个简单的实验。我有一些旋转轮的视频(大约60个 - 手动处理它们太多了)。我想检测每个车轮中车轮的旋转角度。所以我的想法是:将它们分成单帧后,我在图像上运行了一个特征检测,以获得图像特征的移动:

Moving wheel

现在有三组坐标:

  • 圆周运动的那些(意思是:轮子的一部分)
  • 那些在背景中(几乎没有移动 - 但可以用来纠正其他人的坐标)
  • 那些错误检测到的(例如箭头顶部的坐标,向下滑动) - 需要整理的那些。

我想将这三个组分开并检测两个框架之间轮子的旋转角度,但我不知道如何做到这一点。是否有特定的算法来检测固定点周围的旋转?

4 个答案:

答案 0 :(得分:2)

使用RANSAC。让您的模型结合旋转和水平/垂直移位。

仿射变换将起作用(它具有稍微更多的自由度但是被很好地描述)。 设A_i = [x1 y1 0 0 1 0;每个点i 0 0 x1 y1 0 1]。设b_i = [x2; Y2。这给你A和b的维度2n乘6,2n乘1,其中n是点数。

然后使用最小二乘法求解x的Ax = b。 那么你的仿射变换T就是

[x1 x2 x5
 x3 x4 x6
 0  0  1]. 

x5,x6是你不关心的转变。另一个x1到x4描述旋转矩阵(警告,如果你有一点缩放左右,它不是纯粹的旋转,因为标准化使行正常!)。

无论如何,所有这些都有很好的描述。实现应该存在于OpenCV和Matlab中。

更新

我刚刚实施了我的方法。它不起作用。这种方法看到了如此多的非旋转关键点,所提出的与RANSAC的仿射变换只发现了微小的变化。基本上,我找到了身份矩阵。

这是显示由RANSAC识别的内点的图像。Matches (inliers only)

结论1

  1. 方法1:使用匹配识别箭头,并确定转换(仿射会这样做)。
  2. 方法2:忽略轻微的相机移动(或首先移除)并使用纯旋转模型。
  3. 方法1

    将指示箭头从旋转中心一直裁剪到外边缘。包括旋转中心,以便稍后知道位置,并且可以计算围绕该点的旋转。

    方法1的更新

    我试过这个。我试图将第一张图像中的箭头裁剪与其他图像中的箭头相匹配。它经常工作,但不在序列中的所有帧上。没有那么糟糕的GIF压缩的更高分辨率的视频会很好。我个人现在认为,这种方法可以提供更好的结果。

    方法2

    让纯旋转模型为x' = R x,其中x和x'是2D矢量,R是2×2旋转矩阵。

    我们可以使用LS来解决这个问题,正如上面在仿射案例中所提到的那样。 (即A = [x y 0 0; 0 0 x y])但是,如果x和y在图像坐标(像素)中,则模型明显错误,因为它围绕原点进行旋转。从模型内部自动确定原点是不可能的(可以通过首先进行仿射变换并知道第一帧的中心并因此对每一帧进行外推来实现)。

    为简单起见,假设每个图像的旋转中心相同。让它由向量t描述。然后我们只需要从x和x'中减去t。在估算旋转模型之前。

    实现实际上有点困难,因为上面的内容不会对旋转矩阵强制I = R' R。阅读https://math.stackexchange.com/a/77466 Kabsch算法了解更多信息。

    方法2的更新

    问题仍然存在,几乎不动的点必须归类为异常值(你在问题中提到的三组点)。我尝试首先从翻译中删除点,然后估计其余部分的旋转。这不行。

    更新2

    我将代码推送到Github存储库MatlabRotationEstimation。为了取得进一步进展,我认为需要更高分辨率的输入文同样有趣的是,您是否需要逐帧旋转速度或者某些凝聚信息是否足够。

答案 1 :(得分:1)

用于查找车轮旋转的互相关方法(在从视频中提取的两个不同图像之间)

1)找到方向盘的中心。阈值和检测中心(如瞳孔检测)。您可以在轮毂/轴上添加人工标记。

2)使用中心的中心作物投资回报率(仅限辐条)

3)使用对数极坐标变换(从轮毂/轴的中心)。你可以得到一个像素带(甜甜圈)或一行像素(环)。

4)对第二张图像重复(1) - (3)

5)从两个图像中交叉关联两个波段(如上所述)

6)相关中最大值的位置将让您知道车轮经历了多少旋转。相关数组长度的中点是0转的位置。

答案 2 :(得分:0)

我会对这个问题采取略微不同的方法。我不会识别图像中的点,然后试图找到循环回归或适合它们,而是使用纯数学。

首先,拍摄图像的时间衍生物。在离散情况下,这意味着您相互减去相邻帧(n + 1处的帧减去n处的帧)。

图像中未更改的任何区域都将为零,因为两个帧将自行取消。稍微移动的部件会略有不同,而且移动很多的部件会有很大的部件。

我们可以使用这些点处的渐变来确定车轮的移动方向,以及它们的大小以确定点移动的速度。

如果我们将像素作为时间,x和y(I(x,y,t))的函数,则采用时间导数与:

dI(x,y,t)/dt = dI/dx * dx/dt + dI/dy * dy/dt

如上所述,我们可以通过对图像中的每个点取两帧的时间差来计算dI(x,y,t)/dt。同样,我们可以计算dI/dxdI/dy (x, y)(x+1, y) dI/dx (x, y)(x, y+1)的像素之间的数值差异来计算dI/dydI/dx 1}}用于dI/dy案例。

我们有dI/dxdI/dy后,渐变只是< dI's,{{1}}>。您可以使用最小二乘解算器来确定中心点,然后确定运动方向。请记住:大多数渐变都会很小或为零,因为图像中的大多数像素都会被取消,因此您必须使用大于某个阈值的像素。

请注意,如果您想要显示这些{{1}},则必须对它们进行标准化,因为您会有负像素。

答案 3 :(得分:0)

使用FFT解决方案。

参考帧和每个连续(捕获)帧的图像处理:

1)FFT 2D。

2)log-> FFT 2D的极性变换。

3)将步骤2中得到的图像裁切为Y轴上的0:90 dg。在X轴上,可以根据需要通过裁剪结果执行带通滤波。

4)将图像处理后的参考图像与图像处理后的每个连续帧进行互相关。 Y偏移表示旋转,而X表示比例。