一种用于实时视频稳定的新型相机路径规划算法
Introduction
视频稳定根据运动模型分为 2D 和 3D 方法。 第一种方法是 2D 视频稳定 [2],它使用 2D 运动模型(例如简单的平移模型、2D 刚性模型和 2D 仿射模型 [3-12])描述两个连续帧之间的关系。 如果相机在 3D 空间中沿 x 轴和 y 轴的旋转很小,则 2D 视频稳定可提供良好的性能 [13]。 然而,随着相机运动变得动态,二维运动模型无法描述连续帧之间的几何关系,性能非常有限。 lee 等 提出了一种无需明确估计相机运动即可直接稳定视频的方法 [14]。 该方法找到一组变换来平滑特征轨迹 [15, 16] 并稳定视频。
第二种方法是 Buehler 等人引入的 3D 视频稳定 [17]。早期的 3D 方法使用来自运动的结构 (SFM) 技术重建场景和相机运动的 3D 模型 [18]。然后在新的 3D 相机路径上渲染稳定的视图 [17, 19]。 3D 视频稳定提供比 2D 方法更好的性能。由于这些 3D 方法在处理缺乏视差的视频时经常失败,因此它们在许多情况下并不实用 [20]。 Liu 提出了结合 2D 和 3D 视频稳定优点的子空间视频稳定 ...
基于陀螺仪的视频稳定非线性滤波器
Abstract
我们提出了一种对移动设备上捕获的视频进行视频稳定和滚动快门校正的方法。该方法使用来自机载陀螺仪的数据来跟踪相机的角速度,并且可以在相机捕获期间内实时运行。我们消除了由于手抖动引起的小抖动和滚动快门失真,营造出在三脚架上拍摄的视频的效果。
Introduction
大多数中高端移动设备包含一个多核 CPU 复合体、一个图形处理单元 (GPU) 和一个带有 3 轴陀螺仪的惯性测量单元 (IMU)。 在本文中,我们解决了在此类设备上执行视频稳定的挑战,使用陀螺仪进行运动跟踪。 与大多数稳定方法不同,它们作为捕获视频的后处理步骤运行,我们的方法可以作为相机捕获的一部分实时运行。
Background and Prior Work
视频稳定消除了视频中的抖动,它本质上是一个三阶段过程,包括运动估计阶段、平滑测量运动的滤波阶段和生成新视频序列的重新合成阶段。
当深度变化引起像素运动时,基于图像的跟踪方法会受到影响,视差,单应性不容易建模。此外,滚动快门成像传感器可以引入非刚性的帧到帧对应关系,不能简单地通过全局帧到帧运动模型进行建模。为了解决滚动快门问题,Baker 等人 [8 ...
使用陀螺仪的数字视频稳定和卷帘快门校正
Abstract
在本文中,我们提出了一种基于商用陀螺仪的强大实时视频稳定和滚动快门校正技术。首先来对相机运动和卷帘快门扭曲进行建模,然后从单个视频捕获自动校准陀螺仪和相机输出。 这种校准使我们能够仅使用陀螺仪数据来有效校正卷帘快门扭曲并稳定视频。
Video Stabilization and Rolling Shutter Correction
我们系统中的相机运动仅根据旋转进行建模。 我们忽略平移运动,加速度计数据必须被积分两次才能获得位移,因此它们很难使用 IMU 准确测量。即使我们可以准确地测量平移,这也是不够的,因为在相机相同平移量的情况下不同深度的物体移动的量不同,我们将不得不依赖立体或基于特征的运动结构(SfM)算法来获取深度信息。这些方法并不健壮,而且目前在移动平台上实时运行计算成本太高。
Forsse ́n 和 Ringaby[2010] 试图在他们的系统中模拟相机位移,但发现结果比只考虑旋转的模型表现更差。 他们假设优化器在尝试从特征跟踪器重建位移时陷入局部最小值。他们的算法还假设相机正在对纯平面场景(即恒定深度)进行成像。 因此,由于视频中的未建模视差,平移 ...
基于 IMU 传感器的视频稳定混合运动估计
Abstract
在本文中,我们提出了一种混合方法来估计运动并通过切换函数稳定视频,该方法在 Kanade-Lucus-Tomasi (KLT) 跟踪器和 IMU 辅助运动估计器之间切换估计的运动。为了实现这一点,由于 KLT 跟踪器在较大运动期间的性能不佳,我们使用 KLT 跟踪器来校正低旋转的运动,并使用 IMU 辅助运动估计器来校正高旋转,此外,卡尔曼滤波器用于去除不需要的运动,从而平滑轨迹。
Introduction
在相机市场,光学图像稳定(OIS)系统安装在相机镜头或图像传感器上,价格相当昂贵 [3]。另一方面,数字稳定系统通过在相机移动时补偿捕获图像的移动来处理图像,它可以分为三个步骤,即运动估计、运动平滑和图像扭曲 [4,5]。
数字视频稳定中运动估计的常用技术是分别使用块匹配 [9]、KLT (Kanade-Lucus-Tomasi) 跟踪器 [10,11]、SIFT [12] 和 SURF [13]。最近,Dong et al. [14] and Lim 等人 [15] 使用 KLT 跟踪器以高帧率和低计算成本实时估计运动, KLT 跟踪器通过 Good Feat ...
EIS 电子防抖基本原理
投影
这里以小孔成像模型为例,全相模型是相同的流程只是投影模型不一样而已。在相机校准模型一文中已经介绍了将像素坐标系变换到相机坐标系中 相机校准模型 如下:
\[
\begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \begin{bmatrix} \frac{1}{d_x}& 0 &u_o \\ 0 & \frac{1}{d_y}& v_0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \frac{1}{z_c}\begin{bmatrix} \frac{f}{d_x}& 0 &u_o \\ 0 & \frac{f}{d_y}& v_0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x_c\\ y_c\\ z_c \end{bmatrix}
\]
这里我们取 \(z_c = 1\) 再做一个 ...
相机校准模型
小孔成像模型
各坐标系定义及相机的内参和外参
像素坐标系
像素坐标就是像素在图像中的位置。一般像素坐标系的左上角的顶点就是原点,水平向右是 u,垂直向下是 v 轴。
图像坐标系
在像素坐标系中,每个像素的坐标是用像素来表示的,然而,像素的表示方法却不能反应图像中物体的物理尺寸,因此,有必要将像素坐标转换为图像坐标。将像素坐标系的原点平移到图像的中心,就定为图像坐标系的原点,图像坐标系的 x 轴与像素坐标系的 u 轴平行,方向相同,而图像坐标系的 y 轴与像素坐标系的 v 轴平行,方向相同。
在图中,假设在像素坐标系下图像中心的像素坐标是(u0,v0),相机中感光器件每个像素的物理尺寸是 dx * dy,那么,图像坐标系的坐标(x,y)与像素坐标系的坐标(u,v)之间的关系可以表示为:
\[u = \frac{x}{d_x} + u_0 \\ v = \frac{y}{d_y} + v_0 \]
写成矩阵的形式就为:
\[\begin{bmatrix} u \\ v \end{bmatrix} = \begin{bmatrix} \frac{1}{d_x} &a ...
Linux 驱动之 V4L2 子系统
概述
V4L2 是专门为 linux 设备设计的一套视频框架,其主体框架在 linux 内核,可以理解为是整个 linux 系统上面的视频源捕获驱动框架。其广泛应用在嵌入式设备以及移动端、个人电脑设备上面,市面上的编码产品类如:SDV、手机、IPC、行车记录仪都会用到这个框架来进行视频采集。
框架
该图描述了 v4l2 驱动框架的整体结构,v4l2 本质上也是一个字符设备驱动程序,图中芯片模块对应 Soc 的各个子模块,video_device 结构体主要用来控制 Soc 的 video 模块,v4l2_device 会包含多个 v4l2_subdev ,每个 v4l2_subdev 用来控制各自的子模块,某些驱动不需要 v4l2_subdev ,依靠 video 模块就能实现功能。
video_device:一个字符设备,为用户空间提供设备节点(/dev/videoX),提供系统调用的相关操作,是采集设备的抽象接口。
vb2_queue:与 vb2_v4l2_buffer 一起用于数据流的实际逻辑和 DMA 操作。
v4l2_device:表示一个 v4l2 设备的实例。
v4l ...
Linux 驱动之 Regulator 子系统
概述
该框架旨在提供标准内核接口来控制电压和电流 Regulator。其目的是允许系统动态控制 Regulator 功率输出,以节省功率并延长电池寿命。 这适用于电压 Regulator(电压输出可控)和电流 Regulator(电流限制可控)。
命名法
Regulator:
为其他设备供电的电子设备。大多数稳压器可以启用和禁用其输出,而有些可以控制其输出电压和/或电流。输入电压 -> 稳压器 -> 输出电压
PMIC:
电源管理 IC。 包含多个稳压器且通常包含其他子系统的 IC
Consumer:
由稳压器供电的电子设备。 消费者可分为两类:
静态:消费者不会改变其电源电压或电流限制。 它只需要启用或禁用其电源。 其电源电压由硬件、引导加载程序、固件或内核板初始化代码设置 动态:消费者需要改变其电源电压或电流限制以满足操作需求
Power Domain:
由稳压器、开关或其他电源域的输出电源提供其输入电源的电子电路。电源 Regulator 可能位于一个或多个开关后面,例如:
Regulator -+-> Switch-1 -+-> Switch-2 ...
Linux 驱动之 RTC
概述
RTC 和系统时钟有不同的用途。前者是硬件时钟,以非易失方式维护绝对时间和日期,而后者是内核维护的软件时钟,用于实现 gettimeofday(2)和 time(2)系统调用,以及在文件上设置时间戳等。系统时钟报告从起点开始的秒和微秒,起点定义为 POSIX 纪元:1970-01-0100:00:00 +0000(UTC)。
数据结构
rtc 数据结构如下:原图
rtc_device: 内核中使用 rtc_device 结构体来抽象一个 rtc 设备,rtc_device 结构体屏蔽了不同 RTC 硬件之间的差异,通过 rtc_class_ops 结构体为上层提供了访问硬件设备的统一接口
rtc_class_ops: 该结构体提供了对底层差异的抽象,rtc_device 用于描述一个 rtc 设备,而访问该设备的方法对于不同的设备是不同的,rtc_class_ops 用于抽象对 rtc 设备的访问,对上屏蔽了底层操作的差异。编写一个 rtc 设备驱动就是构造一个 rtc_device 结构体并注册进系统,rtc 的访问方法就是 rtc_class_ops 结构体
rtc_t ...
Linux 驱动之 CCF 子系统
概述
CCF 主要用于系统 clock 的管理等操作。clk 的种类说明:
如上图所示,时钟源大概可分为如下几种:
提供基础时钟源的晶振(可分为有源晶振、无源晶振两种)
用于倍频的锁相环
用于分频的 divider
用于多路时钟源选择的 mux
用于时钟使能的与门电路等
而在 CCF 子系统的抽象中,这五种均抽象为 clk,但是针对这 5 种类型的时钟也提供了单独的时钟注册函数(也就是对 clk_register 函数的封装,并针对不同的时钟类型定义了不同的结构体)。
在 CCF 子系统中,针对硬件时钟的操作接口,也抽象了对应的结构体 struct clk_ops,包含时钟的使能接口、时钟频率的修改接口等等。而针对上述所说的不同种类的时钟源,其并不需要实现所有 struct clk_ops 中定义的接口。针对“时钟使能的与门电路”而言,仅需要实现 enabel、disable、is_enable 接口即可;针对多路时钟源选择的 mux 而言,则需要实现父时钟源的设置及获取的接口 set_parent、get_parent 等;对于倍频、分频而言,则需要实现时钟频率相关的接口 se ...