HALCON学习笔记(一)——图像处理基础

HALCON控制语句

1.if 条件语句:

  • 形式1
if(表达式)
    语句组1
endif

语义为:判断表达式的值,如果表达式的值非零则执行语句组1,否则直接转到endif

例子:

*赋值
cont:=2
*判断变量cont的值是否大于等于1,大于等于1就执行语句cont:=cont-1
if(cont>=1)
cont:=cont-1
*if条件语句结束表示
endif
  • 形式2 
if(表达式)
    语句组1
else
    语句组2
endif

语义为:判断表达式的值,如果表达式的值非零则执行语句组1,否则执行语句组2

例子:

cont:=2
*判断变量cont的值是否大于等于1,大于等于1就执行语句cont:=cont-1
if(cont>=1)
cont:=cont-1
*cont的值小于1就执行语句cont:=cont+1
else
cont:=cont+1
*if条件语句结束标志
endif
  • 形式3
if(表达式1)
    语句组1
elseif(表达式2)
    语句组2
else
    语句组3
endif

语义为:判断表达式的值,表达式1的值非零则执行语句组1;表达式1的值为零而表达式2的值非零则执行语句组2;两个表达式的值都为零则执行语句组3

例子:

cont:=2
*判断变量cont是否大于等于1,大于等于1就执行语句cont:=cont-1
if(cont>=1)
cont:=cont-1
*判断变量cont是否小于等于-1,小于等于-1就执行语句cont:=cont+1
elseif(cont<=-1)
cont:=cont+1
*如果cont大于-1小于1执行语句cont:=cont+2
else
cont:=cont+2
*if条件语句结束标志
endif

2.switch多分支条件语句:

格式:

switch(条件)
case常量表达式1:
    语句1
break
.
.
.
case常量表达式n:
    语句n
break
default:
    语句n+1
endswitch

语义为:将条件值与其后的常量表达式的值逐个比较,当条件的值与其后的某个常量表达式的值相等时就执行常量表达式后面的所有语句;如果只想执行一条case语句,则应该在case语句的最后使用break语句结束switch条件语句;如果条件值与所有的常量表达式的值均不相等则执行default后面的语句。switch语句无法处理浮点数所以条件值必须是整数

例子:

I:=5
*I的值与其后的常量表达式的值逐个比较
switch(I)
case 1:
    I:=I-3
*中断语句跳出switch语句
break
*I的值与常量表达式的值相等,执行后面的语句
case 5:
    I:=I+5
break
*I的值与其后所有常量表达式的值都不想等则执行default语句
default:
    I:=2*I
*switch语句结束标志
endswitch

3.while循环语句:

格式:

while(条件)
循环体语句
endwhile

语义为:首先对条件值进行判断,若条件值非零则重复执行循环语句,直到条件值为零时退出while循环;若条件值始终不为零,则while循环容易成死循环需要用break跳出循环

In:=1
In_Sum:=0
*判断In是否小于等于100,小于等于100则执行循环体
while(In<=100)
*求和
In_Sum:=In_Sum+In
*自加10
In:=In+10
*while语句结束标志
endwhile

4.for循环语句:

格式:

for (Index:=start to end by step)
循环体
endfor

通过控制变量的开始值至结束值来进行循环,start为Index变量的开始值,end为结束值,step为步长。

例子:

I:=0
*循环变量I从1到10,每次增加1
for J:=1 to 10 by 1
*每次循环判断J是否小于5,小于5则跳过这次循环
if(J<5)
continue
*if语句结束标志
endif
*求和
I:=I+J
*for循环语句结束标志
endfor

5.中断语句:

break和continue都可以使程序跳过部分代码

在switch或任意循环中使用break语句可以使程序跳出switch或任意循环直接执行后面的语句

continue语句用于循环语句,能使程序跳过循环体中余下的代码进行新一轮的更新

例子:

I:=0
for J:=1 to 10 by 1
*如果J大于5则跳出循环
if(J>5)
break
endif
*如果J==3跳过此次循环
if(J==3)
continue
*if结束标志
endif
*求和
I:=I+J
*for语句结束标志
endfor

 

HALCON算子

基本结构:算子(图像输入:图像输出:控制输入:控制输出)

一般情况下,语句颜色分类为:

  1. 褐色:控制和开发算子
  2. 蓝色:图像获取或处理算子
  3. 浅蓝色:外部函数
  4. 绿色:注释

快捷键介绍:

  • F1:帮助窗口
  • F2:重置程序执行
  • F5:程序运行
  • F6:单步跳过函数
  • F7:单步跳入函数
  • F8:单步跳出函数

HALCON图像处理入门

  • HALCON图像读取

1.方式一:read_image算子读取图像

a.快捷键CTRL+R打开读取图像对话框,选择文件名称所在路径及变量名称

b.用算子窗口调用read_image算子,选择文件名称所在路径及变量名称

c.利用for循环读取同一路径下的多张图。首先声明一个Tuple数组保存文件名及路径,然后利用for循环依次读取Tuple数字保存路径下的图像

for循环读取实例:

*声明数组
ImagePath:=[]
*将文件名及路径保存到数组
ImagePath[0]:='fin1.png'
ImagePath[1]:='fin2.png'
ImagePath[2]:='fin3.png'
*循环读取图像
for i :=0 to 2 by 1
read_image(Image,ImagePath[i])
*for循环结束标志
endfor

2.方式二:采集助手批量读取文件夹下所有图像

菜单栏“助手”——“打开新的image acquisition”——点击“资源”选项卡下的“选择路径”——点击“代码生成”选项卡下的“插入代码”

*遍历文件夹
list_files('路径',['files','follow_links'],Imagefiles)
*筛选指定格式的图像
tuple_regexp_select(Imagefiles,[筛选规则表达式],Imagefiles)
*依次读取图像
for Index:=0 to |Imagefiles|-1 by 1
read_image(Image,Imagefiles[Index])
*显示图像
dev_display(Image)
endfor

遍历文件夹:

list_files(::ImageDirectory文件路径,Extensions文件扩展名,Opitions搜索选项:ImageFiles文件名数组)

筛选指定格式的图像:

tuple_regexp_select(::Data输入文件名数组,Expression文件筛选规则表达式:Selection筛选出的文件名数组)

3.方式三:采集助手采集图像

菜单栏“助手”——“打开新的image acquisition”——点选“图像获取接口”下的“自动检测接口”——点击“连接”选项卡下的“连接”并实时采集——在“代码生成”选项卡下,选择控制流方式,选择采集模式——“插入代码”

异步采集实例:

*连接相机
open_framegrabber(.......)
*设置相机额外参数
set_framegrabber_param(......)
*异步采集开始
grab_image_start(...)
*循环采集图像
while(true)
   *读取异步采集的图像
    grab_image_async(...)
endwhile
*关闭图像采集设备
close_framegrabber(.)

同步采集实例:

*连接相机
open_framegrabber(......)
*循环采集图像
while(true)
*读取同步采集的图像
    grab_image(...)
endwhile
*关闭图像采集设备
close_framegrabber(.)

连接相机并设置相关参数:

open_framegrabber(::Name图像采集设备名称,HorizontalResolution图像采集接口水平分辨率,VerticalResolution图像采集接口垂直分辨率,Image-Width图像宽度,ImageHeigh图像高度,StartRow图像的起始行坐标,StartColumn图像的起始列坐标,Field图像是一半还是完整图像,BitsPerChannel每像素比特数和图像通道,ColorSpace图像通道模式,Generic通用参数与设备细节部分的具体意义,ExternalTrigger是否由外部触发,CameraType使用相机的类型,Device图像获取识别连接到的设备,Port图像获取识别连接到的端口,LineIn相机输入的多路转接器:AcqHandle图像获取设备的句柄)

设置相机额外参数

set_framegrabber(::AcqHandle,Param相机额外参数,Value:)

相机额外参数:

adc_level:设置A/D转换级别

color_space:设置颜色空间

gain:设置相机增益

grab_timeout:设置采集超时终止的时间

resolution:设置相机的采集分辨率

shutter:设定相机的曝光时间

shutter_unit:设定相机曝光时间的单位

white_balance:相机是否打开白平衡模式,默认为关闭白平衡

开始命令相机进行异步采集,要与grab_image_async异步采集算子一起使用:

grab_image_start(::AcqHandle,MaxDelay可以允许最大延时:)

进行图像异步采集:一幅图像采集完成后相机立马采集下一幅图像

grab_image_async(:Image:AcqHandle,MaxDelay可以允许最大延时:)

进行图像同步采集:采集完成后处理图像,处理结束再次采集,采集速率受到处理速度的影响

grab_image(:Image:AcqHandle:)

关闭采集设备:

close_framegrabber(::AcqHandl:)

  • HALCON图像显示

新增图形窗口:

dev_open_window(::row窗口起始x,column窗口起始y,width窗口宽度默认512,height窗口高度默认512,background窗口背景色,windowhandle窗口句柄)

显示图像:

dis_display(object:::)

关闭窗口更新:

dev_update_window(‘off’)或者 点击菜单栏“可视化”—“更新窗口”—“单步模式”—“清空并显示命令”来关闭更新

在窗口中显示字符串:

disp_message(::windowhandle窗口句柄,string显示的字符串,coordsystem当前的操作系统,row显示的x坐标,column显示的y坐标,color字体颜色,box是否显示白色的底纹:)

在窗口以及设置的光标位置显示字符串:

write_string(::windowhandle窗口句柄,string显示的字符串)     一般与set_tpositon配合使用,先用set_tposition算子设置光标位置,再用write_string在光标位置处输出字符串;显示文字必须适合右侧窗口边界

设置光标位置:

set_tposition()

查询字符串宽度:

get_string_extents()

图像显示实例:

*关闭窗口
dev_close_window()
*打开新窗口
dev_open_window(0,0,400,400,'white',windowID)
*设置颜色
dev_set_color('red')
*画箭头
disp_arrow(windowID,255-50,255-20,255,255,1)
*在窗口中显示字符串
disp_message(windowID,'显示文字','window',20,20,'black','true')
dev_set_color('blue')
*设置光标位置
set_tposition(windowID,40,40)
*在窗口已经设置光标位置显示字符串
write_string(windowID,'显示文字1')
*设置光标位置
set_tposition(windowID,255,255)
*读取字符串
read_string(windowID,'default',32,outstring)
  • HALCON图像转换

RGB图像转为灰度图:

rgb1_to_gray(RGBImage输入图像参数:GrayImage输出图像参数::)

如果为三通道,则根据转换公式:灰色值=0.299*红色值+0.587*绿色值+0.114*蓝色值;如果为单通道,直接复制进行输出

求区域与图像的平均灰度值:

region_to_mean(Regions,Image:Imagemean::)

例子:

*读取图像
read_image(Image,'fabrik')
*区域生长
regiongrowing(Image,Regions,3,3,6,100)
*得到区域与图像的平均灰度值
region_to_mean(Regions,Image,Disp)
dev_open_window(0,0,400,400,'black',windowhandle)
*显示图像
dev_display(Disp)

将区域转化成二进制图像:

region_to_bin(Region:BinImage:ForegroundGray,BackgroundGray,Width,Height)

将区域转换成Label图像:

region_to_label(Region:ImageLabel:Type,Width,Height:)

例子:

*读取图像
read_image(Image,'a01.png')
*复制图像
copy_image(Image,Dupimage)
*区域生长
regiongrowing(Dupimage,regions,3,3,1,100)
*将区域转换成二进制图像
region_to_bin(regions,binimage,255,0,512,512)
*将区域转换成Label图像
region_to_label(regions,imagelabel,'int4',512,512)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

上一篇:halcon学习笔记-HSV颜色空间原理


下一篇:Halcon 与OpenCV 预处理的区别 --续篇