工控编程吧

标题: halcon create_bg_esti背景提取相关函数 [打印本页]

作者: qq263946146    时间: 2019-5-25 20:30
标题: halcon create_bg_esti背景提取相关函数
create_bg_esti(InitializeImage : : Syspar1, Syspar2, GainMode, Gain1, Gain2, AdaptMode, MinDiff, StatNum, ConfidenceC, TimeC : BgEstiHandle)

create_bg_esti为背景估算创建一个新的数据集,并用适当的参数初始化它。
估算的背景图像是这个数据集的一部分。
新创建的数据集自动成为当前集。
使用InitializeImage作为背景图像的初始预测。
为了获得较好的预测效果,需要在InitializeImage 中传递未运动物体的用于观测的场景图像。
这样,前景的适应率就可以保持在较低的水平。
如果没有空的场景图像可用,可以使用均匀的灰色图像。
在这种情况下,必须提高前景图像的适配率,因为最初大部分图像将被检测为前景。
初始化图像必须是“byte”或“real”类型。
由于处理单通道图像,必须为每个通道创建数据集。
InitializeImage的大小和区域决定了使用该数据集执行的所有背景估算(run_bg_esti)的大小和区域。


Syspar1和Syspar2是卡尔曼系统矩阵的参数。
系统矩阵根据卡尔曼滤波理论描述了系统灰度值的变化。
背景估计器为每个像素实现一个不同的系统。


GainMode定义了是否应该使用固定的卡尔曼增益进行估计,
或者增益是否应该根据估计值与实际值之间的差异进行调整。
如果将GainMode设置为“fixed”,
则预测前景像素使用Gain1作为卡尔曼增益,预测背景像素使用Gain2作为增益。
Gain1应该小于Gain2,因为前景的适应应该慢于背景的适应。Gain1和Gain2都应该小于1.0。


如果GainMode被设置为“frame”,那么用于前景和背景估计的表格将被计算出来,
其中包含所有256种可能的灰度值变化的卡尔曼增益。
然后,Gain1和Gain2表示调整估计值和实际值之间的差值所需要的帧数。
因此,在固定的适应时间(即帧数)下,所需的卡尔曼增益随着灰度值差的增大而增大。
因此,Gain1应该大于Gain2。
如果背景估计器用于生成一个“空”场景,
假设在观察区域中总是有移动的对象,
那么对于不同的灰度值差异,不同的增益是有用的。
在这种情况下,前台适应的适应时间(Gain1)不能太大。
Gain1和Gain2应该大于1.0。


AdaptMode表示应用于估计值与实际值之间的灰度差的前景/背景决策阈值是固定的,
还是根据背景像素的灰度值偏差进行自适应。


如果AdaptMode被设置为'off',参数MinDiff表示一个固定的阈值。
在这种情况下,参数StatNum、confidence和TimeC毫无意义。


如果AdaptMode被设置为'on',那么MinDiff将被解释为一个基本阈值。
对于每个像素,都会根据像素值随时间的统计评估向该阈值添加偏移量。
StatNum包含用于计算灰度值方差(firfilter)的数据集(过去的帧)的数量。
confidence 用于确定置信区间。


如果背景像素被前景对象隐藏,从而被检测为前景,
则置信区间确定背景统计量的值。
根据学生t分布,置信常数为4.30(3.25,2.82,2.26),
置信区间为'99,8%'('99,0%','98,0%','95,0%')。
TimeC为expr函数保存一个时间常数,
该函数在像素的前景估计时提高阈值。
这意味着,阈值在前景中检测到移动的区域被提高。
这样,如果背景再次可见,就可以容忍较大的光照变化。
增加这种容忍度的主要原因是在隐藏背景时不可能预测光照变化。
因此,不可能对估计的背景图像进行调整。


参数
InitializeImage 初始图像
Syspar1,Syspar2系统矩阵参数1,2,
GainMode 增益模式
Gain1,Gain2卡尔曼增益/前景和背景适应时间。
AdaptMode适应阈值。
MinDiff前景/背景阈值
StatNum统计数据集个数。
ConfidenceC信心常数。
TimeC衰变时间常数。
BgEstiHandleBgEsti数据集的ID。


1.run_bg_esti(PresentImage : ForegroundRegion : BgEstiHandle : )
run_bg_esti使用每个像素上的卡尔曼滤波调整存储在BgEsti数据集中的背景图像,
并返回前景的一个区域(检测到的移动对象)。

使用当前数据集的值及其存储的背景图像和当前图像(PresentImage),估算每个像素的灰度值
通过与阈值(固定的或自适应的,请参见create_bg_esti)进行比较,这些像素被分为前台或后台。
背景估算只处理单通道图像。因此,每个通道的背景都必须单独调整。


背景估算应该用于一半甚至四分之一大小的图像。
为此,必须使用zoom_image_factor减少输入图像(包括初始化的图像!)。
其优点一方面是运行时间短,另一方面是低频段滤波。
滤波消除了高频噪声,得到了更可靠的估算。
因此,可以降低阈值(参见create_bg_esti)。
run_bg_esti返回的前台区域必须再次放大,以便进一步处理。


参数
PresentImage当前图像
ForegroundRegionl输出的被检测的背景区域
BgEstiHandle 函数create_bg_esti生成的BgEsti数据集的ID。


2.update_bg_esti(PresentImage, UpDateRegion : : BgEstiHandle : )
update_bg_esti在UpDateRegion范围内使用PresentImage的灰度值覆盖存储在当前BgEstiHandle 数据集中的图像。
这可以用于“hard”适应:
用这种方法可以快速适应(已知)背景中突然变化的图像区域。


3.give_bg_esti( : BackgroundImage : BgEstiHandle : )
give_bg_esti返回当前BgEstiHandle 数据集的估算背景图像。
背景图像的类型和大小与在create_bg_esti中传递的初始化图像相同。


4.close_bg_esti( : : BgEstiHandle : )
close_bg_esti删除由create_bg_esti创建的 背景估算数据集并释放所有使用的内存。


5.set_bg_esti_params( : : BgEstiHandle, Syspar1, Syspar2, GainMode, Gain1, Gain2,
AdaptMode, MinDiff, StatNum, ConfidenceC, TimeC : )
set_bg_esti_params用于更改数据集的参数。
set_bg_esti_params传递的参数与create_bg_esti中传递的参数相同(参见上面create_bg_esti函数的解释)。
注意,函数无法更改图像格式!
因此,必须创建具有适当格式的初始化图像的新数据集。

要完全交换背景图像,请使用update_bg_esti。
然后,必须同时为输入图像和更新区域传递新图像。


如果GainMode被设置为“frame”,
对于Gain1或Gain2这样的大值,运行时可能会非常长,
因为增益表的值是由一个简单的二分查找决定的。


6.get_bg_esti_params( : : BgEstiHandle : Syspar1, Syspar2, GainMode,
Gain1, Gain2, AdaptMode, MinDiff, StatNum, ConfidenceC, TimeC)
get_bg_esti_params返回数据集的参数。
返回的参数与create_bg_esti和set_bg_esti_params中的参数相同


例程
dev_update_off ()
dev_close_window ()
read_image (Image, 'xing/init')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowID)
set_display_font (WindowID, 14, 'mono', 'true', 'false')
*读取一区域作为检测区域
read_region (XingRegion, 'xing/xing_region')
dev_set_draw ('margin')
dev_set_colored (12)
dev_set_line_width (3)
dev_display (Image)
dev_display (XingRegion)
disp_continue_message (WindowID, 'black', 'true')
stop ()
*缩小读入的图像一半,用于创建背景估算初始化图像
zoom_image_factor (Image, ImageZoomed, 0.5, 0.5, 'constant')
create_bg_esti (ImageZoomed, 0.7, 0.7, 'fixed', 0.001, 0.03, 'on', 8.0, 10, 3.25, 15, BgEstiHandle)
for I := 0 to 587 by 1
    *读取一图像并缩小一半
    read_image (ActualImage, 'xing/xing' + (I$'03'))
    zoom_image_factor (ActualImage, ImageZoomed, 0.5, 0.5, 'constant')
    *执行背景估算,得到前景区域
    run_bg_esti (ImageZoomed, ForegroundRegion, BgEstiHandle)
    *将前景区域放大两倍,还原到图像缩小前大小。
    zoom_region (ForegroundRegion, RegionZoom, 2, 2)
    *计算区域交集,提取图像中检测区域
    intersection (RegionZoom, XingRegion, RegionIntersection)
    *选取前景较大移动物体对应区域
    connection (RegionIntersection, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20, 99999)
    shape_trans (SelectedRegions, RegionTrans, 'convex')
    union1 (RegionTrans, RegionUnion)
    connection (RegionUnion, FinalConnected)
    select_gray (FinalConnected, ActualImage, SelectedRegionsGray, 'deviation', 'and', 25, 1000)
    union1 (SelectedRegionsGray, RegionUnionFinal)
    dilation_rectangle1 (RegionUnionFinal, RegionDilation, 5, 5)
    *计算当前图像区域与前景区域补集,得背景区域
    complement (RegionDilation, BackGround)
    clip_region (BackGround, RegionClipped, 0, 0, Height - 1, Width - 1)
    *刷新背景图
    zoom_region (RegionClipped, BackGroundZoom, 0.5, 0.5)
    update_bg_esti (ImageZoomed, BackGroundZoom, BgEstiHandle)
   *显示图像与提取的移动图像对应区域
shape_trans (SelectedRegionsGray, Rects, 'rectangle1')
    dev_display (ActualImage)
    dev_display (Rects)
endfor
[halcon]1[/halcon]






欢迎光临 工控编程吧 (https://www.gkbc8.com/) Powered by Discuz! X3.4