optical_flow_mg(ImageT1, ImageT2 : VectorField : Algorithm, SmoothingSigma, IntegrationSigma, FlowSmoothness, GradientConstancy, MGParamName, MGParamValue : )
optical_flow_mg计算两幅图像之间的光流。
光流表示单眼图像序列中两个连续图像之间运动的信息。
图像中的运动可以由物体在世界空间上的运动引起,也可以由相机(或两者)在获取两幅图像之间的运动引起。
这些三维运动在二维图像平面上的投影称为光流。
两个连续图像在ImageT1和ImageT2中传递。
计算得到的光流在VectorField 中返回。
向量场VectorField 中的向量表示ImageT1和ImageT2之间在图像平面上的运动。
ImageT2中对应于ImageT1中(r,c)点的点由(r',c') = (r+u(r,c),c+v(r,c))给出,
其中u(r,c)和v(r,c)表示向量场的行和列分量在点(r,c)处的值。
参数Algorithm 允许选择三种不同的算法来计算光流。
这三种算法都是通过使用多重网格求解器来实现的,以确保底层偏微分方程的有效解。
对于Algorithm = 'fdrig',使用了Brox、Bruhn、Papenberg和Weickert提出的方法。该方法是流驱动的,鲁棒的,各向同性的,并使用梯度恒定项。
对于Algorithm = 'ddraw',使用了Nagel和Enkelmann提出的方法的鲁棒变体。这种方法是数据驱动的、鲁棒的、各向异性的,并且使用了翘曲(与原始方法相反)。
对于Algorithm = 'clg'采用了Bruhn、Weickert、Feddern、Kohlberger和Schnorr提出的局部-全局结合方法。
在这三种算法中,输入图像都可以首先通过一个标准偏差为SmoothingSigma的高斯滤波器进行平滑(见derivate_gauss)。
这三种方法都是变分方法,计算光流作为合适能量泛函的最小值。一般来说,能量泛函的形式如下:
optical_flow_mg
其中w=(u,v,1)为待确定光流向量场(第三坐标时间步长为1)。将图像序列视为连续函数f(x),其中x=(r,c,t), (r,c)表示位置,t表示时间。
其中,Ed(w)为数据项,Es(w)为平滑项,a为决定解平滑程度的正则化参数。
正则化参数a为 FlowSmoothness。
数据项对连续图像中目标特征的稳定性进行假设,
如灰度值的稳定性或灰度值的一阶空间导数的稳定性,
而平滑项对解的(分段)平滑性进行假设,
即,则为待确定向量场的平滑度。
参数:
ImageT1,ImageT2输入图像1,2
VectorField 输出的光流
Algorithm 计算光流的算法。有clg', 'ddraw', 'fdrig'
SmoothingSigma 初始高斯平滑的标准偏差。
IntegrationSigma 积分滤波器的标准差。
FlowSmoothness 平滑项相对于数据项的权重。
GradientConstancy 梯度恒常性相对于灰度值恒常性的权重。
MGParamName 多网格算法的参数名。
MGParamValue 多网格算法的参数值。
1.unwarp_image_vector_field(Image, VectorField : ImageUnwarped : : )
unwarp_image_vector_field使用向量字段VectorField解压缩图像,
并在ImageUnwarped中返回未解压缩的图像。
向量字段必须是语义类型“vector_field_relative”,通常由optical_flow_mg确定。
因此,unwarp_image_vector_field可用于将optical_flow_mg的第二个输入图像解压缩到第一个输入图像。
需要注意的是,由于上述语义,向量场图像表示从向量场的目标图像到源图像的逆变换。
2.vector_field_length(VectorField : Length : Mode : )
计算向量场VectorField 向量的长度并保存于Length 。
vector_field_length只接受语义类型“vector_field_relative”的向量字段。
参数Mode 可用于指定如何计算长度。
对于Mode = 'length',计算向量的欧氏长度。
对于Mode = 'squared_length',计算向量长度的平方。
这避免了在内部计算平方根,这在许多处理器上是一个费时操作,
因此节省了这些处理器上的运行时间。
注意VectorField必须在optical_flow_mg返回的相对坐标中。
例程:
* 例程演示使用光流来检测图像序列中的运动对象,通过分析感兴趣区域来检测运动目标。
* 如果检测到移动对象,则自动打开出口门。
ZoomFactor := 0.5
read_image (Image1, 'bicycle/bicycle_01')
zoom_image_factor (Image1, Image1, ZoomFactor, ZoomFactor, 'constant')
dev_update_off ()
dev_close_window ()
dev_open_window_fit_image (Image1, 0, 0, -1, -1, WindowHandle)
dev_set_draw ('margin')
*生成 ROI
gen_contour_polygon_xld (ROI, [0,0,283,348,479,479] * ZoomFactor, [0,379,379,434,639,0] * ZoomFactor)
gen_region_contour_xld (ROI, RegionROI, 'filled')
reduce_domain (Image1, RegionROI, Image1ROI)
* 循环计算光流与显示移动区域
for I := 2 to 27 by 1
read_image (Image2, 'bicycle/bicycle_' + I$'.2')
* *缩小图像以提高光流计算速度
zoom_image_factor (Image2, Image2, ZoomFactor, ZoomFactor, 'constant')
reduce_domain (Image2, RegionROI, Image2ROI)
optical_flow_mg (Image1ROI, Image2ROI, VectorField, 'fdrig', 0.8, 1, 10, 5, ['default_parameters','warp_zoom_factor'], ['fast',0.8])
vector_field_length (VectorField, LengthImage, 'squared_length')
unwarp_image_vector_field (LengthImage, VectorField, ImageUnwarped)
* 使用ROI内移动的区域分割区域
min_max_gray (RegionROI, LengthImage, 0.1, Min, Max, Range)
dev_display (Image2)
if (Max > 2)
threshold (LengthImage, RegionMovement, 2, Max)
connection (RegionMovement, ConnectedRegions)
*选择最大的移动区域
select_shape_std (ConnectedRegions, RegionMovement, 'max_area', 70)
area_center (RegionMovement, Area, RCenterNew, CCenterNew)
if (Area > 0)
shape_trans (RegionMovement, ConvexHullregion, 'convex')
intersection (RegionROI, ConvexHullregion, RegionMovementInROI)
reduce_domain (VectorField, ConvexHullregion, VectorReduced)
vector_field_to_real (VectorReduced, Row, Column)
* 估计运动方向和速度
intensity (RegionMovementInROI, Row, MeanRow, Deviation)
intensity (RegionMovementInROI, Column, MeanColumn, Deviation1)
* 显示结果
dev_set_line_width (1)
dev_set_color ('yellow')
dev_display (VectorReduced)
* 显示ROI
dev_set_line_width (3)
dev_set_color ('magenta')
dev_display (RegionROI)
* 显示感兴趣区域内运动物体的区域
dev_set_color ('green')
dev_display (RegionMovementInROI)
gen_arrow_contour_xld (Arrow, RCenterNew, CCenterNew, RCenterNew + MeanRow, CCenterNew + MeanColumn, 10, 10)
dev_display (Arrow)
endif
endif
*
copy_obj (Image2ROI, Image1ROI, 1, 1)
endfor
运行结果
optical_flow_mg
|