《HALCON数字图像处理》第三章笔记
我在Gitee上建了个仓库,会将学习书本的时候打的一些代码上传上去,笔记中所有代码都在仓库里,初学的朋友可以一起交流哦!地址(Gitee)
第三章 HALCON图像处理基础
HALCON控制语句
- if条件语句
HALCON提供的控制流跟C/C++的差不多,也与RAPID语言有点像,有if就会有endif,while和for也类似这样
num:=10
if (num>=11)
num:=num-1
elseif (num<9)
num:=num+1
else
num:=num*2
endif
得到的结果自然是num值为20
- switch多分支条件语句
switch也跟C/C++差不多,一样是switch+case+break。
num1:=4
switch(num1)
case 1:
num1:=num1+2
break
case 3:
num1:=num1-2
break
case 4:
num1:=num1*2
break
default:
num1:=num/2
break
endswitch
- while循环语句
同C/C++,括号内为真就进入循环,为假时退出循环。
num2:=0
i:=10
while(i>0)
num2:=num2+i
i:=i-1
endwhile
- for循环语句
for循环语句是HALCON最重要的结构,for通过控制变量的开始值和结束值来进行循环,用法跟C/C++一样。
num3:=0
for i:=0 to 9 by 1
if (i<5)
num3:=num3+2
else
num3:=num3-1
endif
endfor
- 中断语句
num3:=20
for i:=0 to 9 by 1
if (i<5)
continue
elseif (i==9)
num3:=num3-8
else
num3:=num3-1
endif
endfor
HALCON算子
HALCON算子的基本结构为:算子(图像输入:图象输出:控制输入:控制输出)
Halcon软件通常里面有四个控制窗口,程序编辑器、算子窗口、变量窗口和图形窗口
HALCON图像处理入门
HALCON图像读取
- 利用read_image算子读取图像
利用read_image算子有三种方式读取图像
快捷键CTRL
+R
使用算子窗口调用read_image算子
利用for循环读取同一路径下的多张图,首先要定义一个Tuple数组保存文件名和路径
* 声明数组
ImagePath:=[]
* 将文件名和路径保存到数组中
ImagePath[0]:='1.jpg'
ImagePath[1]:='2.jpg'
ImagePath[2]:='3.jpg'
* 循环读取图像
for i:=0 to 2 by 1
read_image(Image,ImagePath[i])
endfor
- 利用采集助手批量读取文件夹下所有图像
选择好路径之后就可以生成代码了
* 遍历文件夹
list_files ('C:/Users/Public/Documents/MVTec/HALCON-12.0/examples/images/bicycle', ['files','follow_links'], ImageFiles)
* 筛选格式
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
* 依次读取图像
read_image (Image, ImageFiles[Index])
* 显示图像
dev_display(Image)
endfor
算子讲解:
list_files( : : Directory, Options : Files)
作用:遍历文件夹
Directory
:文件夹路径
Options
:搜索选项,包含以下方面
搜索选项 | 搜索内容 |
---|---|
files | 指定搜索的格式为文件 |
directories | 指定搜索格式为文件夹 |
recursive | 指定可以遍历文件夹下的文件 |
max_depth | 指定遍历的深度 |
max_files | 指定遍历的最大文件数目 |
tuple_regexp_select( : : Data, Expression : Selection)
作用:筛选指定格式的图像
Data
:输入的文件名数组
Expression
:文件筛选规则表达式
Selection
:筛选出的文件名数组
- 用采集助手采集图像
就是连接相机,用相机来获取图像,咸鱼买了个二手带sdk的相机就行了,不会很贵的
简单试了一下异步采集,代码如下
*连接相机
open_framegrabber ('HuaTengVision12_X64', 1, 1, 0, 0, 0, 0, 'progressive', 8, 'Gray', -1, 'false', 'auto', 'Camera1', 0, -1, AcqHandle)
*设置相机额外参数
set_framegrabber_param (AcqHandle, ['shutter','frame_speed'],[10000,1] )
*关闭原窗口
dev_close_window ()
dev_open_window (0, 0, 720, 540, 'black', WindowHandle)
*异步采集开始
grab_image_start (AcqHandle, -1)
while (true)
grab_image_async (Image, AcqHandle, -1)
* Image Acquisition 01: Do something
endwhile
close_framegrabber (AcqHandle)
关键算子说明:
open_framegrabber( : : Name, HorizontalResolution, VerticalResolution, ImageWidth, ImageHeight, StartRow, StartColumn, Field, BitsPerChannel, ColorSpace, Generic, ExternalTrigger, CameraType, Device, Port, LineIn : AcqHandle)
作用:连接相机,设置参数
Name
:图像采集设备名称
HorizontalResolution
:图像采集接口的水平分辨率
VerticalResolution
:图像采集接口的垂直分辨率
ImageWidth
:图像宽度
ImageHeight
:图像高度
StartRow
:图像起始行坐标
StartColumn
:图像起始列坐标
Field
:图像是完整图像还是不完整图像
BitsPerChannel
:每像素比特数和图像通道
ColorSpace
:图像通道模式
Generic
:通用参数与设备细分部分的具体意义
ExternalTrigger
:是否有外触发
CameraType
:使用相机类型
Device
:图像获取识别连接的设备
Port
:图像获取识别连接到的端口
LineIn
:相机输入的多路转接器
AcqHandle
:图像获取设备的句柄
参数 | 选择范围 | 标准值 | 类型 | 描述 |
---|---|---|---|---|
ImageWidth | < width > | 0 | integer | 图像的宽度('0'代表完整图像) |
ImageHeight | < height > | 0 | integer | 图像的高度('0'代表完整图像) |
StartRow | < width > | 0 | integer | 图像的起始行坐标 |
StartColumn | < column > | 0 | integer | 图像的起始列坐标 |
ColorSpace | 'defalut','gray','rgb' | 'gray' | string | HALCON图像通道模式 |
ExternalTrigger | 'false','true' | 'false' | string | 外部触发状态 |
Device | '1''2''3'... | '1' | string | 相机连接第一个设备编号为“1”,第二个设备编号问哦“2”,以此类推 |
set_framegrabber_param( : : AcqHandle, Param, Value : )
作用:设置相机额外参数,Param
为相机的额外参数,需要根据你的sdk提供的参数进行调整,如下图所示
HALCON图像显示
图形窗口
HALCON默认的图形窗口尺寸为512×512,在显示不同尺寸图像时会发生变形,点击图形窗口的“适应窗口”即可自动调整窗口
通常也使用算子dev_open_window( : : Row, Column, Width, Height, Background : WindowHandle)
来新建一个图形窗口
图像显示
图像显示通常用算子dev_display(Object : : : )
显示文字
显示文字通常用两个算子,disp_message
和write_string
-
disp_message( : : WindowHandle, String, CoordSystem, Row, Column, Color, Box : )
作用:在窗口中显示字符串
WindowHandle
:窗口句柄
String
:显示的字符串
CoordSystem
:当前操作系统
Row
:显示的起始行坐标
Column
:显示的起始列坐标
Color
:字体颜色
Box
:是否显示白色的底纹 -
write_string( : : WindowHandle, String : )
作用:在窗口已设定的光标位置显示字符串
write_string
算子通常与set_tposition
配合使用,先用set_tposition
设定光标位置,再用write_string
显示字符串
书上的图像显示示例
*关闭窗口
dev_close_window ()
*打开新窗口
dev_open_window (0, 0, 400, 400, 'white', WindowID)
*设置颜色
dev_set_color ('red')
*画箭头
disp_arrow(WindowID, 255-20, 255-20, 255, 255, 1)
*在窗口显示字符串
disp_message (WindowID, 'Hello,Halcon!', 'window', 20, 20, 'black', 'true')
dev_set_color ('blue')
*设置光标位置
set_tposition (WindowID, 40, 40)
*在窗口已设定的光标位置显示字符串
write_string (WindowID, 'Can you find me?')
*设置光标位置
set_tposition (WindowID, 255, 255)
*设置颜色
dev_set_color ('red')
*读取字符串
* read_string (WindowID, 'Here!!!', 32, OutString)
write_string (WindowID, 'Here!!!')
书上最后那个读取字符串用了read_string,但是我在运行程序的时候发现运行到这句的时候就会卡住,结果是出来了,但是程序我还要最小化在打开才能正常编辑程序,所以我就用了write_string
显示效果如下
HALCON图像转换
- RGB转灰度图
用的是rgb1_to_gray(RGBImage : GrayImage : : )
算子实现,实现的是靠RGB转换为灰度图的公式做的。
- 区域和图像的平均灰度图
用的是region_to_mean(Regions, Image : ImageMean : : )
,可以利用这个算子将得到的ImageMean
的灰度值设置成region和image的平均灰度值
例程运行后的图像如下图
- 将区域转换为二进制图像或Label图像
转换为二进制图像,使用的是region_to_bin(Region : BinImage : ForegroundGray, BackgroundGray, Width, Height : )
,使用这个算子可以将区域转化为“byte”图像,如果输入区域大于生成的图像,程序就会在图像边界处进行剪切
转换为Label图像,使用的是region_to_label(Region : ImageLabel : Type, Width, Height : )
,该算子可以根据索引(1,....,n)将输入区域转换为标签图像,即第一区域被绘制为灰度值1,第二区域被绘制为灰度值2等等,对比生成的图像,灰度值大的区域会被适当地剪切
例程运行后的图像如下图
第三章就到这里啦,祝大家学习能有所收获!😀
作者:Dragonet-Z
出处:https://www.cnblogs.com/dragonet-Z/p/15170141.html
版权声明:本博客所有文章除特殊声明外,均遵循BY-NC-ND许可协议,转载请注明出处!