在 VisualApplets 中实现的示例设计包括:执行几何变换、组合几何变换与 Distortion Correction、以及由图像矩控制的几何变换。几何变换是通过目标到源的映射(即逆向映射)实现的。该方法对于确保发送到 PC 的目标图像中没有缺失像素至关重要 [Bur06]。我们基于算子 FrameBufferRandomRead 以及基于算子 PixelReplicator 的替代方案实现了逆几何变换。这些差异将在随后的子章节中进行解释。在这些子章节中,将详细介绍示例设计。
| 简短说明 | |
|---|---|
|
文件: \examples\Processing\Geometry\GeometricTransformation\GeometricTransformation_ FrameBufferRandomRead.va |
|
|
默认平台: mE5-MA-VCL |
|
|
简要说明 几何变换:使用算子 FrameBufferRandomRead 进行旋转、平移和 Scaling |
|
在 VA 设计“Geometric Transformation_FrameBufferRandomRead.va”中,几何变换是通过目标到源的映射实现的。该方法对于确保发送到 PC 的目标图像中没有缺失像素至关重要 [Bur06]。
源图像的坐标
通过针对所有目标坐标的逆几何变换来计算
。
在坐标
的位置处,
源图像中的像素值由算子读取 FrameBufferRandomRead ,Parallelism 为 1。该算子将每个像素单独存储在 DRAM 中,并逐个读取像素。当计算出的源图像坐标与源图像中的像素坐标不匹配时,线性插值有助于校正发送到 PC 的输出图像中的像素值。
在图 297 中,您可以看到基本设计结构。
该设计包含一个采用 Camera Link Base 配置的相机接口(BaseGrayCamera_Camera)以及 HierarchicalBox Geometric Transformation,其中执行了所获取图像的 Scaling、旋转和平移。算子 ImageBuffer_Buffer 提供了存储图像的机会。通过 DMA(算子 DmaToPC_DMA0),图像被传输到 PC。
在 298 中,您可以看到 HierarchicalBox GeometricTransformation 的内容。 参数 IntParamTranslator、FloatParamReference 和 IntParamReference 使您能够非常方便地设置几何变换的相关参数(Scaling、旋转、平移和图像尺寸的值)。 Property 是图像 Height 和 Width、要在 x 和 y 方向上平移图像的像素数(参数:Translatex 和 Translatey)以及 x 和 y 方向的缩放系数 Scalex 和 Scaley。您可以使用参数 Phi 以度为单位设置旋转角度。作为替代方案,您可以通过在 HierarchicalBox GeometricTransformation 上点击鼠标右键来设置这些 Properties。您可以在图 298 中看到此 box 的内容。
即: SourceImage 以线性方式写入缓冲区 FrameBufferRandomRead。对于每个像素,其最近邻像素都保存在 2x2 kernel 中(HierarchicalBox NextNeighbours)。
目标图像的坐标
(eq. 21)
由算子 CreateBlankImage, CoordinateX 和 CoordinateY
HierarchicalBox OutputImage (包含在 HierarchicalBox CoordinateTransformation)
(参见图 299 和 300)。
坐标
可以根据 eq. 进行反向旋转、平移和/或 Scaling。 21。旋转角
以及用于平移和 Scaling 的参数
和
可以通过如上所述通过传输参数设置相应的常量来选择。在图
301 中,您可以看到 eq. 的 VA
实现方式 21 并支持额外的 Scaling。
逆变换所得的坐标即为源坐标
和
(eq. 21)。在 HierarchicalBox SplitFractionalAndIntegerBit
(见图 298)
这些坐标的整数部分和小数部分是分开的。整数部分对应源图像中的像素位置,
是该算子的坐标输入 FrameBufferRandomRead (沿 x 和 y 方向,见图 298)。
该算子从源图像中对应的坐标处读取像素值信息(Parallelism = 1)以及其邻近像素(见上文)。
源坐标的小数部分
和
对应源图像中的子像素位置。
结合这些信息以及源图像中相邻像素的像素值信息,目标图像中的真实像素值将在 HierarchicalBox Interpolation 中进行双线性插值计算
。有关插值过程的详细说明,请参见 [Bur06].
在图 302 和 303 中,您可以看到几何变换示例的源图像和目标图像。此处执行了 x 和 y 方向各 100 像素的平移以及围绕 45° 的旋转。
| 简短说明 | |
|---|---|
|
文件: \examples\Processing\Geometry\GeometricTransformation\GeometricTransformation_ImageMoments.va |
|
|
默认平台: mE5-MA-VCL |
|
|
简要说明 几何变换:利用图像矩将对象旋转并平移至图像中心 |
|
在此示例设计中,使用图像矩确定 RGB 图像中物体的位置和旋转角度。执行旋转至水平方向并平移至图像中心的操作。默认情况下,输入图像尺寸为 640x240 像素,输出图像尺寸为 256x128 像素。 如图 304 所示,您可以看到基本的设计结构。
该设计由 Camera Link base 配置的 RGB 相机接口(BaseRgbCamera_Camera)以及用于执行所获取图像旋转和平移的 HierarchicalBox Geometric Transformation 组成。在“Properties”下“右键单击”,您可以设置输入和输出图像尺寸以及二值化阈值。该阈值与下文所述的图像矩计算相关。 几何变换采用目标到源映射(参见 节中的引言文本)。 图像通过 DMA(算子 DmaToPC_DMA0)传输到 PC。在图 305 中,您可以查看 Geometric Transformation 的内容。
相对于水平位置的旋转角度和物体的重心位置,是通过在二值化图像(HierarchicalBox Binarization)上计算的 HierarchicalBox ImageMoments 中的图像矩来确定的。ImageMoments 的内容等效于 VA 示例“ImageMoments.va”的框 ImageMoments(参见 节中的图 325),但未计算物体偏心率。HierarchicalBox ImageMoments 的输出链接(从上到下)是 x 和 y 方向的重心位置以及旋转角度。 基于这些参数的源坐标计算(根据公式 21)包含在 HierarchicalBox CoordinateTransformation 中。 在 306 中,您可以查看该框的内容。
在 HierarchicalBox 中 同步方式 x 和 y 方向重心以及旋转的单个像素值被扩展到输出图像尺寸,该尺寸定义在 HierarchicalBox 中 OutputImage。此框的输出链接代表目标图像坐标
。在 HierarchicalBox
InverseTransformation 源坐标
和
根据方程式计算
21。在图 307
中,您可以看到此框的内容。
此框中的设计结构类似于示例“GeometricTransformation_FrameBufferRandomRead.va”和“GeometricTransformation_PixelReplicator.va”中逆变换的实现。不同之处在于,x 和 y 方向的平移参数由 x 和 y 方向的重心与图像中心之间的差值确定(请参见框的内容 Translation_x 和 Translation_y)。旋转角度(框的内容 Phi)由图像矩计算的结果定义。回到图 304中的基本设计结构。计算出的源图像坐标
和
代表框 CoordinateTransformation的输出链接 GeometricTransformation
(见图 308)中,使用算子
FrameBufferRandomRead 执行几何变换以及正确目标像素值的双线性插值,类似于示例“GeometricTransformation_FrameBufferRandomRead.va”(参见 298 节中的图
)。
对于图 309 中的示例对象,您可以在图 310 中看到经过方向和位置校正的目标图像。
| 简短说明 | |
|---|---|
|
文件: \examples\Processing\Geometry\GeometricTransformation\GeometricTransformation_PixelReplicator.va |
|
|
默认平台: mE5-MA-VCL |
|
|
简要说明 几何变换:使用算子 PixelReplicator 进行旋转、平移和 Scaling |
|
VisualApplets 设计示例“GeometricTransformation_PixelReplicator.va”执行与示例 “GeometricTransformation_FrameBufferRandomRead.va”相同的几何变换, 但具有更高的性能。如上所述,算子 FrameBufferRandomRead 将每个像素单独存储在 DRAM 中并依次读取。在本示例中,特定数量的一块像素被存储在 DRAM 单元中。 如果待读取的像素与前一个像素不在同一个单元中,该示例设计才会从 DRAM 读取。图 311 中的示例 展示了每个 DRAM 单元 8 个像素的情况,从中可以体会到性能的提升。
DRAM 块以绿色标记。要读取 9 个像素 a 到 i,您需要 3 个 DRAM 周期而不是 9 个。在此我们实现了 3 的有效 Parallelism。 可以存储在一个 RAM 单元中的 8 位像素的最大数量为 32(marathon VCL 数据宽度:256 Bit)。用于 RAM 单元块的 ROI 形状 由几何变换的旋转角度定义。 在本示例中,默认选择 9x3 像素的 RAM 形状。基本设计结构与 图 297 中的设计结构相同,但没有算子 PARALLELdn_To1。HierarchicalBox GeometricTransformation 的内容也与示例“GeometricTransformation_FrameBufferRandomRead.va”中的 对应框(图 298)相同。区别在于算子 FrameBufferRandomRead 被替换为了 HierarchicalBox FrameBufferRandomRead_Par8。您可以在图 312 中看到其内容。
在框 CollectNeighbors 源图像被分割为子 ROI,这些子 ROI 定义了每个 RAM 单元的大小。此处选择了 9x3 的 RAM 单元大小。在
HierarchicalBoxes 中 SplitAdressX 和 SplitAdressY 源坐标的整数位部分
和
作为逆几何变换的结果(参见节
)被分割为两个组件。高位部分(的上方输出链接
SplitAdressX 和 SplitAdressY)表示 DRAM 单元的位置,低位部分表示
DRAM 单元中的像素位置。在 HierarchicalBox 中的 DRAM 单元坐标处读取 DRAM 单元 Buffer (包含算子 FrameBufferRandomRead),如果未在
HierarchicalBox RepeatDecider 中决定以重用先前的 DRAM 单元。如果决定重用先前的单元,则需要复制 DRAM 单元的像素值。
这是通过
HierarchicalBox 中的 ReplicateValues 配合算子 PixelReplicator的输出链接 ExtractSubKernel 使用像素坐标作为输出,从 DRAM 单元中提取所需的像素值
连同其相邻像素 SplitAdressX 和 SplitAdressY (下输出链路)。
正确目标像素值的双线性插值执行过程类似于 .
| 简短说明 | |
|---|---|
|
文件: \examples\Processing\Geometry\GeometricTransformation\GeometricTransformation_ DistortionCorrection.va |
|
|
默认平台: mE5-MA-VCL |
|
|
简要说明 几何变换:使用 PixelReplicator 算子进行旋转、平移、Scaling、畸变和梯形畸变(Keystone)校正 |
|
VA 示例“GeometricTransformation_DistortionCorrection.va”是对设计“GeometricTransformation_PixelReplicator.va”的扩展。 此外, 此设计中还实现了畸变和梯形畸变(Keystone)校正(根据公式 22 和公式 23)。在下文中,将仅解释与 “GeometricTransformation_PixelReplicator.va”不同的部分。在图 313 中可以看到 基本设计结构。
来自 CameraLink 基本配置相机接口的灰度图像(最大尺寸:4096x4096 像素) (BaseGrayCamera_Camera)在 HierarchicalBox GeoTransAndDistCorr 中进行变换,并通过 DMA 传输到 PC (DmaToPC_DMA0)。该结构等同于设计“GeometricTransformation_FrameBufferRandomRead”和 “GeometricTransformation_PixelReplicator”。 GeoTransAndDistCorr 的结构等同于这两个设计的箱体 GeometricTransformation (见图 298)。这里执行逆变换,此外还执行 畸变和梯形畸变(Keystone)校正。箱体 CoordinateTransformation(位于箱体 GeometricTransformation中)的内容如图 314 所示。
类似于设计“GeometricTransformation_FrameBufferRandomRead”和
“GeometricTransformation_PixelReplicator”(第 和
节),目标坐标
根据公式进行逆变换
21 并进行了附加的 Scaling(另见第
节)。
利用逆变换得到的坐标,我们在 HierarchicalBoxes
KeystoneCorrrection 和 DistortionCorrection中执行逆梯形畸变(Keystone)和 Distortion Correction。
这些箱体的内容显示在图
315 以及图
314.
在这些方框中等式。 22 和等式。 23 已实现。方框中的矩阵元素 m1 到 m9。
Z_x, Z_y 和 N (见图 315) 可以借助 OpenCV 库进行计算 [16b对于示例图像“Example.tif”(位于\examples\Processing\Geometry\GeometricTransformation目录下),您可以在相同位置的文本文件“MatrixValues.txt”中找到示例矩阵值。对于图中的畸变校正, 314 首先,将坐标变换到相对于光心的坐标系中(坐标变换_x 和 坐标变换_y),在大多数情况下,这指的是图像中心。在 HierarchicalBox 中 失真系数 距离
(参见公式) 23从光心计算。对于每个
然后是一个失真校正参数
存在于查找表中(见图)。
317查找表由外部 Matlab 模块创建,您可以在 \examples\Processing\Geometry\GeometricTransformation\LUTDistortionCorrection.m 和畸变参数中找到它。
和
使用 OpenCV 库创建 [16b]。在“LUTDistortionCorrection.m”中,您可以找到校正参数的示例
和
针对示例图像“Example.tif”(位于 \examples\Processing\Geometry\GeometricTransformation 下)[16a]。
系数
随后将与坐标相乘
和
(图
314)。随后,生成的畸变
坐标将被转换回相对于“图像左上角”的坐标系(参见方框 坐标变换_x 和 坐标变换_y)。其
结果即为源图像坐标
和
。HierarchicalBox 的内容
LimitCoordinateValues (图 314)
为转换后的图像坐标设置了边界条件。在分离整数和小数位部分
(参见方框 SplitFractionalAndIntegerBit 中看到框 298)后,从源图像中读取计算出的
对应整数源图像坐标处的像素值。
小数位部分用于根据 [ Interpolation] 进行双线性插值(参见Bur06),
以修正输出图像中由于源图像中的像素间位置而产生的像素值。信号通过 DMA 传输至 PC。
作为演示,您可以在图 318,
319 和
320 中看到畸变源图像、
梯形畸变和畸变校正后的目标图像,以及旋转并经畸变校正的目标图像。
| 简短说明 | |
|---|---|
|
文件: \examples\Processing\Geometry\GeometricTransformation\DistortionCorrection.va |
|
|
默认平台: mE5-MA-VCL |
|
|
简要说明 在此示例设计中,实现了畸变校正。 |
|
在设计“DistortionCorrection.va”中,实现了根据公式 22 的畸变校正。它类似于设计“GeometricTransformation_DistortionCorrection.va”中的校正, 但未执行几何变换和梯形畸变校正。您可以在图 321 中看到基本设计结构。
该设计包括一个用于灰度相机的接口Camera Link 基本配置包括缓冲模块、HierachicalBox DistortionCorrection和DmaToPC 。灰度图像的畸变校正在DistortionCorrection中执行。其内容如图322所示。
该结构类似于 HierarchicalBox 的内容。 GeometricTransformation (见图) 298)在“GeometricTransformation_PixelReplicator.va”的设计中 操作员 FrameBufferRandomRead 被分层框取代 FrameBufferRandomRd_Par8 正如“GeometricTransformation_PixelReplicator.va”和“GeometricTransformation_DistorationCorrection.va”中所做的那样(参见各部分)。 和
源图像以线性方式写入缓冲元素。
FrameBufferRandomRd_Par8在该模块中,每个像素还存储了三个相邻像素(见方框)。 CollectNeighbors 盒子里
FrameBufferRandomRd_Par8)。在盒子里 CoordinateTransformation/ OutputImage 目标图像坐标
使用运算符创建 CreateBlankImage,
CoordinateX 和 CoordinateY这些坐标根据公式进行变换。 22 到源图像坐标
HierarchicalBox
反向校正 (见方框) CoordinateTransformation)。您可以在图中看到它的内容。 323.
这相当于实现 DistortionCorrection "GeometricTransformation_DistortionCorrection.va" 的方框(参见图
316)。对于每个目标图像半径
相对于图像中心,查找表值
C_r 在 HierarchicalBox 中被选定 失真系数. C_r 与目标图像坐标相乘
根据公式 22
并转换回相对于第一个像素的坐标系(参见 CoordinateTransformation_x_1 和 CoordinateTransformation_y_1)。正如您在图 322 中所看到的,生成的源坐标在方框中被拆分为整数部分和小数部分
SplitFractionalAndIntegerBit。整数部分用于读取相应源图像坐标处的源图像像素,小数部分则用于最终结果的双线性插值。随后,经过畸变校正的图像通过 DMA 传输至 PC。




上一页

