主要内容

立体形象整改

这个例子展示了如何实现立体图像矫正一对校准立体相机。模型的例子是FPGA-hardware兼容,并提供实时性能。这个例子比较其结果与计算机视觉工具箱™rectifyStereoImages函数。

介绍

立体相机是一个摄像系统和两个或两个以上的镜头和一个单独的每个镜头的图像传感器。他们是用于距离估计,使三维图片,和stereoviews。相机镜头扭曲图像,很难完全平行对齐两个摄像头。因此,来自一对立体相机的原始图像必须纠正。立体形象整改项目图片到一个通用的图像平面,这样两个立体图像中的对应点有相同的行坐标。这幅图像投影纠正两个摄像头的图像似乎是平行的。

这个示例中使用的算法执行失真切除和对齐调整在一个单一的系统。

立体图像校正算法

立体图像校正算法使用反向映射技术输出纠正图像的像素位置映射到输入的像素相机图像。图中显示了算法的四个阶段。

计算校正参数:这个阶段计算整流参数输入立体相机标定参数。这些校准参数包括相机intrinsic、旋转矩阵,转换矩阵和畸变系数(径向和切向)。这一阶段为每个相机返回单应性矩阵,和输出范围。计算所需的输出范围的整数像素坐标输出整流的形象,和所需的单应性矩阵变换的整数像素坐标输出相应纠正图像不失真图像的坐标。

几何逆变换:一个逆几何变换将一个点在一个图像平面上到另一图像平面。在立体图像纠正,这个操作整数输出修正图像中像素坐标映射到相应的坐标输入相机的图像通过使用单应性矩阵,H。如果(p, q)是一个整数在整流输出图像和像素坐标(x, y)是不失真图像的相应的坐标,那么这个方程式转换。

$ $ [x \水平间距{0.2厘米}y \水平间距z]{0.2厘米}_ {1 x3} = [p \水平间距{0.2厘米}提问# xA; \水平间距{0.2厘米}1]_ {1 x3} * H ^ {1} _ {3 x3} $ $

在哪里H单应性矩阵。从均匀转换到笛卡尔坐标系,x被设置为x / zy被设置为y / z

Undistortion:光学透镜扭曲畸变变形图像。主要有两种类型的透镜扭曲:径向和切向畸变。径向畸变时光线弯曲透镜边缘附近的比他们做的光学中心。切向畸变发生在镜头和图像平面不平行。除失真,算法不失真图像的坐标映射到输入相机图像通过使用畸变系数。

(u, v)的坐标输入相机图像和(x, y)无畸变的像素位置。x和y是规范化的像素坐标转换光学中心和除以像素的焦距。下面的方程描述undistortion操作。

$ $ u_{径向}= x (1 + k_ r ^ {1} {2} + k_ {2} r ^ {4}) $ $ & # xA; $ $ u_{切线}= 2 p_ {1} xy + p_ {2} (r ^ {2} + 2 x ^ {2}) $ $

$ $ v_{径向}= y (1 + k_ r ^ {1} {2} + k_ {2} r ^ {4}) $ $ & # xA;, $ $ v_{切线}= 2 p_ {2} xy + p_ {1} (r ^ {2} + 2 y ^ {2}) $ $

在哪里$ r ^ {2} = x ^ {2} + y ^ {2} $

$ $ k_ {1} $ $,$ $ k_ {2} $ $径向畸变系数$ $ p_ {1} $ $,$ $ p_ {2} $ $切向畸变系数

$ $ u = u_{径向}+ u_{切线}$ $

$ $ v = v_{径向}+ v_{切线}$ $

逆几何变换和undistortion都为一个整体的坐标之间的映射输出图像不失真矫正(u, v)和输入相机图像的坐标。

插值:插值重新取样图像强度值对应生成的坐标。这个例子使用双线性插值。

如图表所示,(u, v)是生成的输入像素的坐标undistortion阶段。I1,I2,I3,预告是四个相邻的像素,然后呢deltaU是目标像素的位移与其邻近像素。这个阶段计算加权平均的四个相邻的像素用这个方程。

$ $ rectifiedPixel = I_ {1} (1-deltaV) + I_ (1-deltaU) {2} (deltaU) (1-deltaV) + I_ {3} (1-deltaU)(均)+ I_ {4} (deltaU)(均)$ $

HDL实现

图显示了StereoImageRectificationHDL模型的顶层视图。LeftInputImage和RightInputImage块进口音响左派和右派的图像文件。帧的像素块转换这些立体图像帧像素流pixelcontrol公共汽车为HDLStereoImageRectification子系统的输入。这个子系统执行几何逆变换,undistortion,插值生成整流输出像素值。帧的像素块的流转换输出像素帧。LeftImageViewer和RightImageViewer子系统显示输入帧和相应的整流输出。

InitFcn示例模型从数据文件导入立体标定参数和计算校正参数通过调用ComputeRectificationParams.m。或者,您可以生成自己的组整流参数并提供他们面具InverseGeometricTransform和Undistortion子系统的参数。

HDLStereoImageRectification子系统生成一个pixelcontrol从两个输入总线ctrl公交车。RectifiedCoordinateGeneration子系统生成的行和列输出整流和不失真图像的像素坐标。它使用两个HDL计数器生成行和列坐标。InverseGeometricTransform子系统将这些坐标映射到它们相应的行和列坐标,(x, y)扭曲的形象。Undistortion子系统映射(x, y)坐标对应的坐标(u, v)输入摄像机的图像,使用畸变系数和立体相机intrinsic。

插值子系统存储输入的像素强度立体图像在内存和计算的四个邻居的地址(u, v)插值所必需的。计算每个整流输出像素强度、子系统读取四个邻居像素值,发现他们的加权和。

逆几何变换

逆几何变换的HDL实现繁殖的坐标(行坳1)逆的单应性矩阵。反单应性矩阵(3×3)是一个蒙面InverseGeometricTransformation子系统的参数。ComputeRectificationParams.m,称为InitFcn的模型,生成单应性矩阵。转换子系统实现了矩阵乘法与产品块乘以单应性矩阵的每个元素。HomogeneousToCartesian子系统转换生成的齐次坐标,[x y z]笛卡儿的格式,(x, y)进行进一步处理。HomogeneousToCartesian子系统使用相应的块配置为使用ShiftAdd体系结构,UsePipelines参数设置为“上”。看到这些参数,右键单击并选择HDL代码>高密度脂蛋白块属性。在这个阶段之前,字长与每个操作允许增长。HomogeneousToCartesian子系统后,坐标的字长截断的大小还确保生成的坐标的精度和准确性。

Undistortion

Undistortion采用3×3相机的HDL实现内在矩阵,畸变系数(k1 k2 p1 p2)和的倒数外汇财政年度作为蒙面参数。ComputeRectificationParams.m,叫做InitFcn的模型,生成这些参数。内在矩阵被定义为左$ $ \[{\{数组}{ccc}开始外汇& # 38;斜& # 38;残雪\ \ 0 & # 38;财政年度& # 38;cy \ \ 0 & # 38;0 & # 38;1 \ \ \{数组}}结束\]$ $

Undistortion子系统实现了方程中提到的立体图像校正算法部分通过使用金额,产品,和移位运算块。这个词长度与每个操作允许种植,然后反规范化子系统的单词长度尺寸仍然确保生成坐标的精度和准确性。

插值

这部分描述了插值子系统内部的三个组件。

地址的一代

AddressGeneration子系统需要映射坐标输入的原始图像(u, v)作为输入。计算位移deltaU每个像素的相邻像素。它还轮的坐标对负无穷到最近的整数。

AddressCalculation子系统检查对输入图像的边界坐标。如果任何坐标是形象维度外,限制到边值进行进一步处理。接下来,该子系统的指数计算的四个邻居像素的地址在CacheMemory子系统。索引代表缓存的列。每个地址的指数是决定使用偶数和奇数自然传入的列和行坐标,确定提取的位块。

% = = = = = = = = = = = = = = = = = = = = = = = = = =% |行| |坳| |指数| |% = = = = = = = = = = = = = = = = = = = = = = = = = =奇怪奇怪% | | | | | 1 | |奇怪甚至% | | | | | 2 | |甚至奇怪% | | | | | 3 | |甚至甚至% | | | | | 4 | |% = = = = = = = = = = = = = = = = = = = = = = = = = =

邻域像素的地址生成使用这个方程:

$ $地址=(\压裂{列大小}{2}* nR) + nC $ $

在哪里nR行协调,数控是列坐标。

$ nR = \压裂{行}{2}1美元,如果美元\水平间距\{0.1厘米}行水平间距{0.1厘米}\水平间距是{0.1厘米}$,$ nR = \压裂{第1行}{2}$,如果美元\水平间距\{0.1厘米}行水平间距{0.1厘米}\水平间距是{0.1厘米}奇怪的美元

$数控= \压裂{坳}{2}$,如果美元\水平间距{0.1厘米}坳\水平间距{0.1厘米}\水平间距是{0.1厘米}$,$数控= \压裂{坳+ 1}{2}$,如果美元\水平间距{0.1厘米}坳\水平间距{0.1厘米}\水平间距是{0.1厘米}奇怪的美元

一旦所有的地址和生成相应的指标,它们是使用矢量连接块矢量化。IndexChangeForMemoryAccess MATLAB函数块将其指数递增的顺序地址。这个操作可以确保正确的从CacheMemory抓取的数据块。给出的地址然后CacheMemory块作为输入,和指数,deltaU,被传递到BilinearInterpolation子系统。

高速缓冲存储器

CacheMemory子系统包含一个简单的双端口RAM。输入像素的缓冲(线1像素1 | 2像素1 | 1号线像素2 | 2像素2行)的内存。这个配置使算法能够阅读所有四个相邻像素在一个循环。所需的缓存内存的大小的计算抵消位移参数ComputeRectificationParams.m脚本。的位移的总和最大偏差第一行地图。的第一行地图是输入图像行坐标的最大值对应输出的第一行纠正图像。最大偏差最大的区别是每一行的最大和最小行坐标输入图像行地图。

WriteControl子系统形成矢量的像素,和向量写启用和写地址。读地址AddressGeneration子系统提供了一个向量。矢量的像素从RAM返回传递给BilinearInterpolation子系统。

双线性插值

BilinearInterpolation子系统将从缓存读取像素矢量的原来的指数。然后,BilinearInterpolationEquation块计算邻域像素的加权和通过使用双线性插值方程中提到的立体图像校正算法部分。插值的结果输出的值是纠正像素。

仿真和结果

这个示例使用960 -,- 1280立体图像。输入像素使用uint8数据类型。这个例子不提供multipixel支持。金宝app由于大型帧大小在这个例子中,使用模拟需要相对较长的时间来完成。

图中显示左和右输入图像和相应的纠正输出图像。StereoImageRectificationHDL模型匹配的结果的输出rectifyStereoImages在MATLAB函数的误差+ / - 1。

您可以生成HDL代码HDLStereoImageRectification子系统。你必须有一个高密度脂蛋白编码器™许可生成HDL代码。这个设计合成了英特尔®Arria®10 GX 115 s2f45i1sg FPGA。HDL设计实现时钟频率为150 MHz。表显示了子系统的资源利用率。

% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =% |模型名称| | StereoImageRectificationHDL | |% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =输入图像分辨率% | | | 960 x 1280 | |% | ALM利用率| | 10675 | |总额% |注册| | 24487 | |总内存块% | | | 327 | |% |总DSP模块| | 218 | |% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

引用

[1]Bradski和a . Kaehler学习OpenCV: OpenCV的计算机视觉库。塞瓦斯托波尔,CA: O ' reilly, 2008年。

另请参阅

(计算机视觉工具箱)

相关的话题