matlab计算图像旋转角度,关于算法:如何检测图像中坐标的旋转角度

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

现在有三组坐标:

那些以圆周运动(即:车轮的一部分)

那些在背景中(几乎没有移动-但可用于校正其他坐标的坐标)

以及那些错误检测到的错误(例如,箭头上方的坐标,向下滑动)-需要进行分类。

我想将这三个组分开,并检测框架之间轮子的旋转角度,但是我不知道如何执行此操作。是否有用于检测绕固定点旋转的特定算法?

您能发布一个示例视频吗?

您想要整个视频的旋转角度还是速度?

使用RANSAC。让模型成为"旋转"和水平/垂直移位的组合。

仿射变换会起作用(它的自由度稍高一些,但描述得很好)。

令A_i = [x1 y1 0 0 1 0; 0 0 x1 y1 0 1]。令b_i = [x2; y2]。得出A和b的尺寸为2n x 6,2n x 1,其中n是点数。

然后使用最小二乘法求解x的Ax = b。

仿射变换T为

[x1 x2 x5

x3 x4 x6

0  0  1].

x5,x6是您不关心的转变。另一个x1到x4描述了旋转矩阵(caveat,如果您有一点缩放,那不是纯粹的旋转,因为可以归一化以使行成为orthoNormal!)。

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

更新资料

我只是实施了我的方法。没用这种方法看到了很多非旋转关键点,以至于拟议的使用RANSAC的仿射变换只发现了很小的变化。基本上,我找到了身份矩阵。

这是一张显示由RANSAC标识的内部图像的图像。

matlab计算图像旋转角度,关于算法:如何检测图像中坐标的旋转角度_第1张图片

结论1

方法1:使用匹配标识箭头,然后确定变换(仿射即可)。

方法2:忽略相机的轻微移动(或先移开),然后使用纯旋转模型。

方法1

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

方法1的更新

我试过了我尝试将第一张图片中箭头的裁切与其他图片中的箭头进行匹配。它通常工作,但不适用于序列中的所有帧。没有那种糟糕的GIF压缩的高分辨率视频将是不错的选择。我个人现在认为,这种方法将产生更好的结果。

方法二

令纯旋转模型为x' = R x,其中x和x'为2D向量,R a为2x2旋转矩阵。

就像在仿射案例中提到的那样,我们可以使用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。 RANSAC估计转换矩阵是正确的方法。

这实际上是非常具有挑战性的。 这里的第一个动作是平移(几乎没有抖动),大多数点都属于该变换。 我们要的第二个是旋转! 因此,更多的内线将属于"无/小运动"转换。

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

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

2)使用中心的中心作物ROI(仅辐条)

3)使用对数极性转换(从轮毂/车轴的中心开始)。您可以获得一个像素带(甜甜圈)或一行像素(环)。

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

5)将两个图像的两个波段互相关(如上所述)

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

在步骤2和3之前,您还可以执行FFT 2D并将该FFT 2D互相关(在步骤5中)。 X轴是比例尺,Y轴是角度。 在FFT 2D频谱上,您可以通过简单地在X(频率滤波)和Y(例如仅0-90 dg)中裁剪频谱来轻松执行带通滤波。

FFT解决方案。

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

1)FFT 2D。

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

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

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

对于这个问题,我会采取稍微不同的方法。我将使用纯数学,而不是识别图像中的点,然后尝试查找圆回归或拟合它们。

首先,取图像的时间导数。在离散情况下,这意味着您要彼此减去相邻的帧(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/dx情况下(x, y)和(x+1, y)像素以及dI/dy情况下(x, y)和(x, y+1)像素之间的数值差来计算dI/dx和dI/dy。

一旦我们有了dI/dx和dI/dy,渐变就是dI/dx,>。您可以使用最小二乘法求解器确定中心点,然后确定运动方向。请记住:由于图像中的大多数像素将被抵消,因此大多数渐变将很小或为零,因此您必须使用大于特定阈值的像素。

请注意,如果要显示这些dI's,则必须将它们归一化,因为像素为负。

这是(密集)光流。 为此,还有更健壮的方法,但使用关键点或光流,最后必须拟合中心点和运动方向(我称其为"拟合模型")。 拟合正确的模型并不那么简单。

你可能感兴趣的:(matlab计算图像旋转角度)