HALCON示例程序forest.hdev识别森林中的树
示例程序源码(加注释)
- 关于显示类函数解释
dev_close_window ()
dev_update_window (‘off’)
read_image (Forest, ‘forest_air1’)
get_image_size (Forest, Width, Height)
dev_open_window (0, 0, Width, Height, ‘black’, WindowHandle)
decompose3 (Forest, Red, Green, Blue)
dev_display (Red) - 二值化
threshold (Blue, BlueBright, 80, 255) - 分割连通域
connection (BlueBright, BlueBrightConnection) - 通过面积进行区域筛选
select_shape (BlueBrightConnection, Path, ‘area’, ‘and’, 100, 100000000)
dev_set_color (‘red’)
dev_set_draw (‘margin’)
dev_display (Path)
disp_continue_message (WindowHandle, ‘black’, ‘true’)
stop () - 二值化红色通道图像
threshold (Red, RedBright, 120, 255) - 分割连通域
connection (RedBright, RedBrightConnection) - 使用面积进行区域筛选
select_shape (RedBrightConnection, RedBrightBig, ‘area’, ‘and’, 1500, 10000000) - 使用圆形元素进行闭运算
closing_circle (RedBrightBig, RedBrightClosing, 7.5) - 使用圆形元素进行开运算
opening_circle (RedBrightClosing, RedBrightOpening, 9.5) - 分割连通域
connection (RedBrightOpening, RedBrightOpeningConnection) - 使用面积进行区域筛选
select_shape (RedBrightOpeningConnection, BeechBig, ‘area’, ‘and’, 1000, 100000000) - 使用区域的平均灰度进行区域筛选
select_gray (BeechBig, Blue, Beech, ‘mean’, ‘and’, 0, 59)
dev_display (Red)
dev_display (Beech)
disp_continue_message (WindowHandle, ‘black’, ‘true’)
stop () - 联合区域
union1 (Beech, BeechUnion) - 返回区域的补集
complement (BeechUnion, NotBeech) - 求取两区域不相交部分
difference (NotBeech, Path, NotBeechNotPath) - 缩小定义域
reduce_domain (Red, NotBeechNotPath, NotBeechNotPathRed) - 二值化
threshold (NotBeechNotPathRed, BrightRest, 150, 255) - 分割连通域
connection (BrightRest, BrightRestConnection) - 通过面积筛选区域
select_shape (BrightRestConnection, Meadow, ‘area’, ‘and’, 500, 1000000)
dev_display (Red)
dev_display (Meadow)
disp_continue_message (WindowHandle, ‘black’, ‘true’)
stop () - 将两个对象合为一个对象
union2 (Path, RedBrightClosing, BeechPath) - smooth_image - 使用各种滤镜平滑图像。
- smooth_image(原图:平滑后的图像:滤波器,滤波参数:)
smooth_image (Red, RedGauss, ‘gauss’, 4.0) - invert_image - 反转图像。
invert_image (RedGauss, Invert) - watersheds - 从图像中提取流域和盆地。
- watersheds (图片:盆地,流域::)
watersheds (Invert, SpruceRed, Watersheds) - 通过面积与灰度进行区域筛选
select_shape (SpruceRed, SpruceRedLarge, ‘area’, ‘and’, 100, 5000)
select_gray (SpruceRedLarge, Red, SpruceRedInitial, ‘max’, ‘and’, 100, 200) - 生成一个空对象
gen_empty_obj (LocalThresh) - 计算对象数量
count_obj (SpruceRedInitial, NumSpruce)
dev_update_var (‘off’)
dev_update_pc (‘off’)
for i := 1 to NumSpruce by 1- 在组员对象中选取指定对象
select_obj (SpruceRedInitial, SingleSpruce, i) - 求取最大最小灰度值,当第三个参数设置为50时返回中值
min_max_gray (SingleSpruce, Red, 50, Min, Max, Range) - 减少定义域
reduce_domain (Red, SingleSpruce, SingleSpruceRed) - 二值化
threshold (SingleSpruceRed, SingleSpruceBright, Min, 255) - 分割连通域
connection (SingleSpruceBright, SingleSpruceBrightCon) - 选取最大面积的区域
select_shape_std (SingleSpruceBrightCon, MaxAreaSpruce, ‘max_area’, 70) - 将多个区域合并到一个组员下,但不改变对象个数
concat_obj (MaxAreaSpruce, LocalThresh, LocalThresh)
- 在组员对象中选取指定对象
endfor
- 开运算
opening_circle (LocalThresh, FinalSpruce, 1.5)
dev_set_line_width (2)
dev_set_color (‘red’)
dev_display (Red)
dev_display (FinalSpruce)
dev_set_color (‘green’)
dev_display (Beech)
dev_set_color (‘yellow’)
dev_display (Meadow)
处理思路
这个例子是主要讲解了如何通过无人机拍摄的图像识别其中的对象。smooth_image 、watersheds 等算子被应用。
后记
大家有什么问题可以向我提问哈,我看到了第一时间回复,希望在学习的路上多多结交良师益友。