找回密码
立即注册
搜索
发回帖 发新帖

4904

积分

0

好友

630

主题
发表于 1 小时前 | 查看: 7| 回复: 0

手持摄像头对着一栋楼拍摄,楼本身没有移动,视频里的窗框却左右跳动。把摄像头缓慢转向另一栋楼,画面整体移动又很正常。到了晚上,即便视频已经过了防抖处理,窗框位置看起来稳了,边缘仍可能拖着一层模糊。

这几种现象经常同时出现,却需要完全不同的解释。理解电子防抖,首先要弄清楚三件事:哪些运动来自相机、哪些运动应该被保留,以及已经拍下来的图像还能改变什么。

电子防抖的基本思路,是估计实际拍摄运动,设计一条更平滑的目标轨迹,再把原图像变换到目标视角下的画面。 补偿作用在图像的几何位置上,最终还要满足有效像素范围、输出视场和处理延迟等约束。

这一篇从成像关系讲起,把“运动估计、轨迹平滑、图像补偿”串成一个完整过程。光流如何计算、IMU 怎样标定、RK 接口如何调用,后续篇章再结合实验单独展开。

1. 相机动了,为什么画面里的景物也会动?

1.1 景物的位置没有变,观察它的位置和方向变了

图像记录的是景物相对于相机的投影。一个固定在墙上的角点,在三维空间中没有移动;相机的位置或朝向发生变化后,它落在感光面上的位置就会改变。

用针孔模型来表达:一个点在相机坐标系中的位置为 $P_c = (X_c, Y_c, Z_c)^T$,投影到图像上的位置为 $p = (u, v)^T$,则有:

$$u = f_x \cdot \frac{X_c}{Z_c} + c_x,\qquad v = f_y \cdot \frac{Y_c}{Z_c} + c_y$$

这里的 $f_x, f_y$ 是用像素表示的焦距,$(c_x, c_y)$ 是主点,可近似理解为理想模型中光轴与图像平面的交点,它不一定正好位于画面几何中心。相机一动,景物在相机坐标系中的坐标随之改变,投影位置自然也就变了。真实镜头还存在畸变,需要在这个理想模型上继续修正。

不必一开始就背矩阵。先记住一个直观关系:在常见的局部近似下,相机朝右偏一点,固定背景在图像里就会朝左偏一点;相机向下点头,背景则可能向上移动;相机绕光轴旋转,画面会出现倾斜。

电子防抖原理图解:静态背景为什么会在帧中漂移

图1 世界中的景物保持不动,相机的观察位置或方向改变,景物在图像中的位置随之改变。图中的水平位移用于说明局部关系,不能代替任意三维运动模型。

1.2 旋转和平移,会留下不同的图像运动

相机运动可以分为旋转和平移。旋转是朝向发生变化,比如左右转头、上下点头、绕镜头轴线转动;平移是整个相机位置发生变化,比如向左挪动、向前走近。两者在图像中的表现并不完全一样。

对于纯旋转,在理想针孔模型下,像素之间的对应关系可以只由相机内参与相对旋转确定,不需要逐点知道景物深度。而一旦涉及平移,深度通常就不能忽略:向右挪动一段距离,近处栏杆在画面里移动得多,远处建筑移动得少。这种与深度有关的相对变化就是视差。

因此,“把整张图统一平移几像素”可以说明最简单的补偿,却不可能覆盖所有拍摄运动。实际方法会根据场景,使用平移、旋转、相似变换、单应变换或局部网格等不同描述方式。模型选择的依据只有一个:它能否合理解释当前画面中的运动。

1.3 很小的角度,也可能变成明显的像素位移

在图像中心附近,针对较小的左右转动,可以用近似公式估算水平位移大小:

$$\Delta u \approx f_x \cdot \theta$$

其中角度 $\theta$ 必须使用弧度。假设焦距为 1000 像素,转动角度只有 $0.2^\circ$,换成弧度约为 0.00349,对应的像素位移约为 3.49 像素。

这个数值是简化条件下的计算示例。它解释了为什么手上感觉很轻微的一次抖动,在视频里仍然清晰可见;同时也提醒我们:讨论防抖精度时,必须把角度、镜头和像素尺度放在一起看,不能只盯着一个孤立的姿态角误差。

2. OIS、IBIS 和 EIS,分别在哪里补偿?

防抖既可以在成像过程中进行,也可以对数字图像做后处理。常见实现位置如下:

类型 主要执行方式 直接改变的对象
镜头光学防抖(OIS) 移动镜头内部的补偿镜片组 光线到达感光面的位置
机身防抖(IBIS) 移动图像传感器 感光面相对于成像光束的位置
电子防抖(EIS) 根据运动信息重映射、裁剪图像 已形成数字图像中的像素对应关系

OIS 和 IBIS 在成像过程中调整光路或传感器位置,尽量减小曝光期间像在感光面上的移动。它们能补偿哪些方向、幅度多大,取决于具体硬件以及镜头与机身的配合。

EIS 则根据已经得到的图像和运动信息,重新安排输出画面。它可以在相机内部实时运行,也可以在视频拍摄完成后执行;“电子处理”并不意味着一定要等整段视频录完。

这些方式也能协同工作。物理补偿先减少成像过程中的晃动,数字处理再调整残余的画面运动。不过,协同系统需要考虑到前面的补偿已经改变了成像关系,应根据补偿后的残余运动继续处理,不能把两套补偿量各算一遍后就简单叠加。

还要区分相机运动和主体运动。相机固定时,一个人从左走到右,是主体在运动。通常的视频防抖应保留这个过程;把这个人固定在画面中央,属于另外的跟踪或构图目标,不能混为一谈。

3. 一套电子防抖,至少要完成三件事

从功能上看,EIS 可以拆成三个核心环节:估计实际运动、生成目标轨迹、合成稳定画面。 实际工程还要把时间信息、镜头参数和边界约束接进来。

电子防抖完整过程图解:测运动、定目标、改像素

图2 运动信息决定怎样补偿,图像数据提供可供采样的像素。IMU 并非所有 EIS 都必须具备;纯视觉方案可以从图像估计运动,陀螺仪方案则需要可靠的样本时间与标定关系。

3.1 估计实际运动:相机刚才怎样动了?

实际运动可以从图像中估计,也可以借助惯性传感器测量。

视觉方法会观察纹理、角点或图像块在连续帧中的变化,尝试找出能够解释背景运动的变换。陀螺仪直接提供角速度,经过单位换算、零偏修正、时间处理和积分,可以得到相机旋转的估计。两类信息也可以结合使用。

这里得到的是“实际发生了什么”,并没有决定输出应该怎样呈现。例如,估计结果可能同时包含一次缓慢向右的摇摄和叠加在上面的细碎抖动——怎样把两者分开,正是后面目标轨迹要解决的事。

3.2 生成目标轨迹:希望镜头怎样运动?

假设摄像头正在缓慢转向右侧的建筑。目标画面应当保留这次转向,同时减弱手部造成的来回摆动。如果把所有帧都固定到第一帧视角,补偿量会随着转动不断增大,最终超出原图能够提供的范围。

目标轨迹因此可以是静止的,也可以是缓慢移动、平滑转向或受裁剪边界限制的。路径优化研究会对运动的速度、加速度以及边界施加约束,以获得更自然的输出运动;具体的优化方法不是这一篇的重点。

用低通滤波压制快速变化,是理解轨迹平滑的一个入口。但实际拍摄中,有意运动和抖动的频率可能重叠,不能把“低频全部保留、高频全部消除”当成所有场景都成立的规则。

3.3 合成稳定画面:怎样从原图得到目标画面?

实际轨迹和目标轨迹确定后,就能计算两者之间需要施加的几何补偿。随后,对每个输出像素查找它应该从原图哪里取值,再处理插值、边界和裁剪。

这一步才真正生成新图像。前面算出的角度、位移或矩阵,只是告诉这一阶段该怎样取像素。

一个完整系统还要反馈边界压力:如果当前目标姿态需要的图像内容已经超出原始视场,就必须调整目标、增加裁剪,或者接受一定残余运动。平滑和裁剪因此常常需要联合考虑,而不是两个完全独立的后处理开关。

4. 用一个能算清的例子,看懂补偿量从哪里来

4.1 先约定一个简单模型

只考虑水平方向,并假设背景静止。为了把原理算清,把相机运动折算成等效的图像平移量,全部使用像素作为单位。

定义三个量:

  • $c_k$:第 $k$ 帧的实际等效运动位置。
  • $s_k$:第 $k$ 帧希望呈现的平滑目标位置。
  • $X$:背景点在参考画面中的水平坐标。

这里的 $c_k$ 不是以毫米表示的相机物理位置。真实三维位移投影到图像时还涉及焦距和深度,本例已把这些因素简化为统一的像素位移。

约定 $c_k$ 为正时,背景在实际图像中向左移动,则背景点在第 $k$ 帧中的位置为:

$$x = X - c_k$$

若这一帧是沿目标轨迹拍摄的,背景点应当出现在:

$$x' = X - s_k$$

所需的图像补偿量就是两者之差:

$$d_k = c_k - s_k$$

把它加到实际图像位置上:

$$x' = x + d_k$$

电子防抖真正需要施加的,是实际轨迹相对于目标轨迹的修正。 目标一变,补偿量也随之改变——这就是为什么同一个实际运动,不同的目标轨迹会产生截然不同的输出画面。

4.2 五帧数据,逐帧检查方向

下面是一组为解释原理而构造的数据。实际轨迹来回摆动,目标轨迹缓慢向右推进。目标数值是人为设定的示意值,不是某种滤波器的实测输出。

帧序号 $k$ 实际位置 $c_k$ 目标位置 $s_k$ 图像补偿 $d_k$
0 0 0 0
1 4 0.5 3.5
2 -3 1 -4
3 5 1.5 3.5
4 1 2 -1

所有位置和补偿量的单位都是像素。以参考位置 $X = 400$ 的背景点为例,帧序号 $k = 1$ 时,实际拍到的位置是 $x = 400 - 4 = 396$;目标位置是 $x' = 400 - 0.5 = 399.5$,因此需要把图像中的这个点向右补偿 3.5 像素。

帧序号 $k = 2$ 时,实际运动变成了 -3,背景点出现在 $x = 400 - (-3) = 403$。目标仍在平滑推进,应当把这个点放到 $x' = 400 - 1 = 399$,因此补偿量变为 -4 像素。

电子防抖补偿量图解:实际轨迹与目标轨迹之差

图3 实际轨迹、目标轨迹和补偿量是三个不同的量。蓝色补偿曲线由前两条曲线相减得到;图中数据仅用于说明一维平移关系。

补偿量在正负之间变化,而背景点的输出位置始终按 $x' = X - s_k$ 平滑变化。目标相机向右推进时,静态背景在输出图像中向左移动。这个例子也解释了为什么“把相机运动取反”不够准确:只有在目标轨迹已经明确、坐标方向与简化条件也明确时,才能讨论补偿的符号。

4.3 “虚拟相机”究竟是什么意思?

虚拟相机是对目标观察视角的数学描述。它没有实际存在的镜头,却规定了输出画面应该对应哪个方向、怎样移动、保留多大视场。

真实相机沿着 $c_k$ 拍摄,图像处理希望输出看起来像沿着 $s_k$ 拍摄。只要目标视角需要的内容能从原图找到,就可以通过几何变换构造近似的目标画面。

这里的“只要”很关键。虚拟视角如果看到了真实相机没有拍下的区域,就没有像素可以取。虚拟相机还受到原始视场、场景深度、遮挡、成像模糊和计算资源的限制——它不是一个可以任意移动的理想观察者。

5. 从补偿量到新画面:像素究竟怎样搬?

5.1 几何对应和实际采样,要分开理解

在前面的例子里,几何关系是:输入中的点向右移动 $d_k$,成为输出中的点。

但程序生成输出图像时,通常从输出像素出发,反过来查找输入位置。若前向关系为 $x_{out} = x_{in} + d_k$,则取样时使用:

$$x_{in} = x_{out} - d_k$$

例如输出坐标 400,补偿量为 3.5,就要去输入图像的 396.5 位置取样。396.5 不在整数像素中心上,需要根据邻近像素进行插值。OpenCV 的 remap() 就采用从目标位置查找源位置的映射方式。

这也是补偿方向容易写反的地方:描述“输入点移到哪里”和实现“输出点从哪里取值”,用的是互逆关系。检查代码时应当先明确接口接收的是哪一个方向,不能只盯着矩阵前面有没有负号。

5.2 三维旋转不是三个二维平移量

当相机发生三维旋转时,补偿需要经过投影关系。为说明这一点,给出纯旋转情况下的一个常见表达式。

约定 $R_{actual}$ 将实际相机坐标转换到世界坐标,$R_{target}$ 将目标相机坐标转换到世界坐标。输入和输出内参分别为 $K$、$K'$。在相同光心、理想针孔模型下,并假设整帧可近似使用同一姿态、暂不考虑明显的卷帘形变:

$$p' \sim K'\, R_{target}^{-1}\, R_{actual}\, K^{-1}\, p$$

这里 $p, p'$ 表示齐次像素坐标,符号 $\sim$ 表示二者相差一个非零尺度,最后还要做归一化。输入坐标应属于理想针孔图像;真实镜头的畸变应通过相应相机模型组合进映射,不能直接忽略。

这串矩阵按动作来理解就是:先把像素变成观察方向,再把实际相机的方向转换到目标相机中,最后投影回输出图像。

第一篇需要把这条关系看清就够了。它说明了三个重要条件:补偿依赖内参;旋转矩阵有明确的坐标方向;目标姿态和实际姿态必须分别定义。把三个姿态角逐项取负,并不能自动得到正确的像素映射。

5.3 重映射也会改变图像质量

重新取样通常涉及非整数位置。插值能够产生所需的采样值,但不能凭空增加原图细节;多次连续重采样还可能进一步影响清晰度。

因此,工程中可以先在坐标关系上组合镜头校正、防抖和输出缩放,再根据最终映射执行采样。在数学模型和硬件允许的情况下,这有助于减少不必要的中间图像处理。

另一类问题是映射位置越过原图边界。此时输出像素找不到有效输入数据,若填充为黑色,就会出现黑边。黑边表达的是“当前视角没有对应的输入像素”,并不等同于采集数据损坏——这个区分在调试时特别容易混淆。

6. 为什么防抖经常伴随着裁剪?

6.1 补偿需要空间

拿一张已经拍好的图片向右移动,左侧就会露出空白;把它旋转一点,四角也可能出现没有内容的区域。EIS 无法从这张图片中取到原本没有拍下来的部分。

常见做法是在原始视场中保留一定余量,让最终输出窗口始终落在有效像素区域内。画面经过补偿后,输出窗口只截取其中一部分;必要时再缩放到要求的输出尺寸。

电子防抖裁剪原理图解:补偿需要边缘余量

图4 裁剪隐藏的是重映射后的无效区域。示例保留输入宽高各 80%,每边的余量分别是对应尺寸的 10%;旋转、畸变和组合运动会进一步改变可用范围。

6.2 把裁剪比例说准确

假设输入图像为 1280×720,居中保留 1024×576 的矩形。它在宽度和高度上都保留了 80%,因此:

  • 左右各有 128 像素余量。
  • 上下各有 72 像素余量。
  • 保留面积为原图的 $0.8 \times 0.8 = 0.64$,即 64%。

这与“每一边裁掉 20%”是不同含义——前者说的是面积,后者说的是边长。

若只考虑水平和垂直平移,不含旋转、畸变及插值边界需求,这个居中窗口可以分别容纳最大约 ±128 像素、±72 像素的位移。实际补偿一旦加入旋转,四个角的有效性也要一起检查,不能再直接沿用这两个平移限值。

再把 1024×576 放大到 1280×720,输出文件的分辨率恢复了,视场却没有恢复。被裁掉的景物仍然在画面之外,插值也不会找回那部分图像细节。

6.3 稳定程度、视场和跟随感,需要共同取舍

目标轨迹越接近完全静止,实际拍摄轨迹与它的差距就可能越大,所需补偿也就越大。如果裁剪余量有限,就需要让目标轨迹适当跟随实际运动。

动态缩放可以根据补偿需求调整视场,但缩放变化过快会出现类似呼吸的画面放大与缩小。Gyroflow 的稳定设置也把平滑、视场和动态缩放作为可以调整的相关项目。

因此评价防抖时,不能只播放“最稳”的一段视频。还应看画面裁掉了多少、正常转向是否自然、停止转向后有没有回弹,以及视场是否反复变化——这些维度缺一不可。

7. 陀螺仪为什么有用,又为什么还不够?

7.1 它提供旋转线索,图像提供像素

陀螺仪测量角速度。经过时间积分,可以估计某段时间内的旋转变化。与单纯分析图像相比,这条信息不需要依赖墙面上有没有纹理,也不会直接把画面中移动的人误认为相机转动。

但它只提供运动线索。积分结果还要经过坐标转换、目标轨迹设计和几何映射,才能作用到图像。陀螺仪本身也不能描述近景和远景各自的平移视差。

因此,一套姿态解算程序能稳定输出角度,并不意味着已经完成视频防抖。实际姿态估计、目标轨迹平滑和图像补偿分别解决不同的问题,不能混成一个。

还应分清两种“滤波”:对陀螺仪数据滤波,是为了得到更可靠的运动估计;对目标轨迹平滑,是为了决定希望输出怎样运动。如果把真实的相机振动在运动测量阶段就过度滤掉,后面的补偿反而可能缺少必要信息。

7.2 运动信息必须对应正确的成像时刻

一帧图像记录的是一段成像过程,陀螺仪记录的是一串带时间的角速度样本。只有把二者对应起来,才知道这张图需要使用哪段运动。

可以把错误同步理解成:画面拍下的是相机向右转时的场景,算法却取到了稍后开始向左转的数据。即使角速度数值本身准确,补偿仍然可能失效,甚至把晃动放大。Gyroflow 通过比较视觉运动与惯性运动,估计二者的时间关系,自动匹配的结果也需要人工检查。

在驱动链路中,应用拿到缓冲区的时间还可能包含传输、排队和调度延迟。V4L2 文档区分时间戳的时钟来源和对应事件,例如 EOF、SOE;实际含义要结合具体驱动确认。

因此 DQBUF 返回时间、CSI/ISP 的 SOF 事件、曝光开始时间之间,不能仅凭名称画等号。同样,一次从 IMU FIFO 读出多条记录,也不能把读取完成时间直接当成每条记录的采样时刻。

这一篇先建立“运动必须对上成像时间”的认识。时间误差与像素误差的关系,以及时偏、时钟漂移的标定方法,后续单独展开。

8. 画面稳了,为什么还会有果冻、模糊和视差?

8.1 帧间晃动和帧内形变,需要分别观察

如果一栋楼在每一帧里都保持笔直,只是整栋楼的位置来回跳,看到的主要是帧与帧之间的视角变化。

如果快速横摆时,门框在单帧内出现随运动变化的剪切或弯曲,在排除正常透视和镜头畸变后,就需要考虑帧内成像时间差。卷帘快门下,不同行的曝光时刻不同;相机在这一段时间里继续运动,各行就可能记录下不同的观察方向。

卷帘快门原理图解:帧内各行曝光时刻不同

图5 每行曝光多久、首末行曝光起点相隔多久、相邻帧相隔多久,是三个不同的问题。图中采用等行间隔、单次曝光模式作示意;全局快门也不要求图像数据必须同时读出。

对这一简化模式,第 $r$ 行的曝光中点可以写成:

$$t_{mid}^{(r)} = t_0 + r \cdot \Delta t_{row} + \frac{T_{exp}}{2}$$

其中 $t_0$ 是首行曝光开始时刻,$\Delta t_{row}$ 是相邻行的时间间隔,$T_{exp}$ 是每行曝光时长。这里的 $r$ 指实际读出顺序中的行,$r = 0$ 表示首行;图像经过裁剪、缩放或翻转后,需要重新对应行号。

只给整帧套一个姿态,通常无法完整描述明显的卷帘形变。更细的校正会根据不同行或网格对应的时间,使用相应的运动信息。陀螺仪辅助逐行校正已有经典研究实现,但它测量的是相机运动,不能自动知道某个运动物体在曝光期间怎样变形。

8.2 曝光期间已经混合的细节,不会因为画面稳定而回来

设想拍摄一个很小的亮点。若曝光期间它在感光面上划过一段距离,最后记录的就可能是一条亮线。将这条亮线整体移动到正确位置,并不会使它重新变成清晰的小点。

所以几何位置稳定与成像清晰是两件相关但不同的事。EIS 可以让画面不再大幅跳动,长曝光造成的模糊仍可能留在画面里。要改善后者,需要从曝光、光照、成像过程中的物理补偿,或专门的去模糊算法等方面入手。

首行和末行的成像时间跨度,也不能直接当作曝光时间。读出跨度较短并不意味着每行曝光一定短,帧率较高也不等于所有画面都没有明显模糊。

8.3 近景和远景,未必能用同一个变换同时稳定

在车窗前同时拍摄近处栏杆和远处建筑,车辆平移时,两者在画面里的移动幅度不同。如果强行让栏杆完全固定,远处建筑可能出现残余移动;如果以远景为准,近景仍可能晃动。

这种问题来自深度、平移和遮挡关系。更复杂的局部运动表示或网格方法可以处理部分全局模型难以解释的变化,但同时要约束局部拉伸,避免把直线或物体形状扭坏。

因此测试防抖不能只有“手持晃几下”。至少要分别观察静止、旋转、正常摇摄、近远景平移和不同曝光条件,才能判断问题出在哪个环节。

9. 放到 RK 视频系统中,各部分怎样分工?

EIS 的数学关系与具体芯片无关;实时运行方式则受到平台接口、图像格式、缓存和硬件能力影响。下面以 ISP 输出图像后进行防抖的逻辑方案为例。

RK平台EIS落地原理图:运动参数要作用到图像像素

图6 这是一种便于理解和自主实现的逻辑分工。具体 BSP 可能把部分功能放入 ISP、图像处理库或媒体框架中,不能据此认定所有 RK 平台具有相同接口。

9.1 采集链路负责提供图像和可靠的元数据

Sensor、CSI、ISP 负责完成成像和图像输出。对防抖而言,还需要知道这帧图像的序号、时间戳、曝光信息以及所用模式。

IMU 采集链路则提供逐样本运动和时间信息。两条链路最终要在同一个可追溯的时间关系下使用。把图像帧与错误的补偿参数配对,会破坏几何正确性;即使算法公式本身没有问题,输出也可能突然跳动。

9.2 算法决定取样位置,像素处理模块执行变换

算法部分主要处理运动、轨迹和映射参数;像素处理部分按照这些参数生成新图像。两者的计算量和访问内存的方式不同,性能分析时应分开测量。

RK 平台上可能使用 CPU、GPU 或适用的几何处理模块执行映射,具体需要核实所用 SoC 和 SDK。公开 RGA 指南中的 imrotate() 支持 90°、180°、270°,其缩放、裁剪和格式转换也有明确接口;这些能力不能直接等同于连续小角度旋转、任意透视变换或逐行防抖 mesh。

同样,找到一个 FEC、LDCH 或 DIS 配置项之后,还需要继续确认可接受的映射形式、是否支持按帧更新、怎样与输入帧同步,以及真实的数据通路在哪里。

9.3 编码、缓冲区和延迟仍然属于系统的一部分

稳定后的图像可以直接用于本地预览,也可以交给编码器后存储或送入流媒体链路。编码码流若需要显示,应先解码。Rockchip MPP 提供编解码相关接口和帧、缓冲区等基础对象;具体项目也可能使用更上层的媒体封装。

在这些模块之间传递帧时,需要遵守各处理阶段的完成与释放关系。像素处理硬件仍在读取输入帧时,不能让采集端提前覆盖它;编码器仍在读取输出帧时,也不能复用同一块内存写入下一帧。

算法若需要等待未来 $N$ 帧,单是等待就大约增加:

$$\Delta t_{wait} = \frac{N}{fps}$$

例如 30 fps 下,等待后续 2 帧约为 66.7 ms。这个数值还没有包含采集、排队、重映射和编码时间。使用未来信息可以帮助设计轨迹,但并非所有 EIS 都必须等待固定数量的未来帧;因果方法与有限前瞻方法需要根据延迟目标选择。

这也解释了为什么“处理达到 30 fps”还不够。达到这一帧率只能说明相应测试条件下的吞吐情况;是否丢帧、新增延迟、队列增长、尾部耗时和音画同步仍要分别检查。

10. 怎样判断对电子防抖的理解是否完整?

可以用下面几个问题检查一个方案:

检查问题 对应的技术环节
怎样知道相机发生了什么运动? 视觉运动估计、惯性测量或二者结合
正常摇摄为什么还能保留? 目标轨迹的设计,而不只是估计原始运动
每个输出像素从原图哪里来? 几何映射、反向采样和插值
补偿超出原始视场时怎么办? 有效区域约束、裁剪、缩放和目标调整
当前帧为什么使用这一段 IMU 数据? 成像时间、样本时间和同步关系
门框扭曲与整幅画面位移怎样区分? 帧内逐行成像与帧间运动
位置稳了但细节仍然糊,原因是什么? 曝光积分与运动模糊
算法能持续运行,并满足延迟要求吗? 硬件变换、缓冲区生命周期和实时调度

第一轮验证可以选一段曝光较短、背景静止、以轻微旋转为主的视频,同时输出实际运动、目标运动和补偿量。先证明三者关系正确,再逐步加入正常摇摄、近景平移、长曝光和强振动。

这样做能够把问题分开:运动估计错了,就先查数据与模型;轨迹不自然,就查目标设计;出现黑边,就查有效像素范围;帧内直线仍然扭曲,就继续检查逐行时序;运行一段时间越来越慢,就查队列和吞吐。

画面抖动需要补偿的,是实际成像视角相对于期望平滑视角的变化。 从运动测量到目标轨迹,再到像素重映射,三个环节缺一不可。理解了这条关系,后续再学习光流、陀螺仪积分、卷帘校正和 RK 实时接入,就有了一条共同的主线。

下一篇从图像出发,观察两帧之间的特征如何移动,再讨论怎样从这些局部变化中估计相机运动。后续篇章也将在云栈社区继续更新,欢迎就 EIS 实现细节一起交流。

参考文献与延伸阅读

以下链接对应正文中的编号。图示和数值例子为原理说明而绘制、构造,不代表某款设备的实测性能。

  1. Canon — Image Stabilisation — 镜头防抖与机身防抖的工作原理。
  2. OpenCV — Camera Calibration and 3D Reconstruction — 针孔成像、内参、畸变与几何模型。
  3. Grundmann, Kwatra, Essa — Auto-Directed Video Stabilization with Robust L1 Optimal Camera Paths, CVPR 2011 — 目标路径与约束优化。
  4. OpenCV — Geometric Image Transformations — 反向映射、插值和边界处理。
  5. Gyroflow — Stabilization — 平滑、视场与动态缩放。
  6. Karpenko, Jacobs, Baek, Levoy — Digital Video Stabilization and Rolling Shutter Correction using Gyroscopes, Stanford Technical Report CSTR 2011-03, 2011 — 陀螺仪防抖与卷帘校正。
  7. Gyroflow — Synchronization — 图像运动与惯性数据的时间关系。
  8. Linux Kernel Documentation — V4L2 Buffers — 缓冲区、时间戳类型与来源。
  9. Rockchip — RGA IM2D API Instruction — 图像处理能力与接口范围。
  10. Rockchip — Media Process Platform — 编解码、帧和缓冲区相关实现。
  11. Richard Szeliski — Computer Vision: Algorithms and Applications, 2nd ed. — 成像、图像配准和运动估计的进一步阅读。
  12. Liu, Yuan, Tan, Sun — Bundled Camera Paths for Video Stabilization, SIGGRAPH 2013 — 网格运动表示、视差与几何约束。



上一篇:Linux内核FUTEX_LOCK_PING:用代理执行解决用户态优先级翻转
下一篇:CAPM的“另一个时刻”:方差—方差相关性如何定价第三阶风险
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-10-9 06:29 , Processed in 0.070911 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表