Loading

《HALCON数字图像处理》第三章笔记

我在Gitee上建了个仓库,会将学习书本的时候打的一些代码上传上去,笔记中所有代码都在仓库里,初学的朋友可以一起交流哦!地址(Gitee)


第三章 HALCON图像处理基础

HALCON控制语句

  1. 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

  1. 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
  1. while循环语句

同C/C++,括号内为真就进入循环,为假时退出循环。

num2:=0
i:=10
while(i>0)
num2:=num2+i
i:=i-1
endwhile
  1. 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
  1. 中断语句
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软件通常里面有四个控制窗口,程序编辑器、算子窗口、变量窗口和图形窗口

image

HALCON图像处理入门

HALCON图像读取

  1. 利用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
  1. 利用采集助手批量读取文件夹下所有图像

image
image
选择好路径之后就可以生成代码了
image

* 遍历文件夹
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:筛选出的文件名数组

  1. 用采集助手采集图像

就是连接相机,用相机来获取图像,咸鱼买了个二手带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)

image

关键算子说明:
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提供的参数进行调整,如下图所示

image

HALCON图像显示

图形窗口

HALCON默认的图形窗口尺寸为512×512,在显示不同尺寸图像时会发生变形,点击图形窗口的“适应窗口”即可自动调整窗口

image

通常也使用算子dev_open_window( : : Row, Column, Width, Height, Background : WindowHandle)来新建一个图形窗口

图像显示

图像显示通常用算子dev_display(Object : : : )

显示文字

显示文字通常用两个算子,disp_messagewrite_string

  1. disp_message( : : WindowHandle, String, CoordSystem, Row, Column, Color, Box : )
    作用:在窗口中显示字符串
    WindowHandle:窗口句柄
    String:显示的字符串
    CoordSystem:当前操作系统
    Row:显示的起始行坐标
    Column:显示的起始列坐标
    Color:字体颜色
    Box:是否显示白色的底纹

  2. 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

显示效果如下

image

HALCON图像转换

  1. RGB转灰度图

用的是rgb1_to_gray(RGBImage : GrayImage : : )算子实现,实现的是靠RGB转换为灰度图的公式做的。

  1. 区域和图像的平均灰度图

用的是region_to_mean(Regions, Image : ImageMean : : ),可以利用这个算子将得到的ImageMean的灰度值设置成region和image的平均灰度值

例程运行后的图像如下图

image

  1. 将区域转换为二进制图像或Label图像

转换为二进制图像,使用的是region_to_bin(Region : BinImage : ForegroundGray, BackgroundGray, Width, Height : ),使用这个算子可以将区域转化为“byte”图像,如果输入区域大于生成的图像,程序就会在图像边界处进行剪切

转换为Label图像,使用的是region_to_label(Region : ImageLabel : Type, Width, Height : ),该算子可以根据索引(1,....,n)将输入区域转换为标签图像,即第一区域被绘制为灰度值1,第二区域被绘制为灰度值2等等,对比生成的图像,灰度值大的区域会被适当地剪切

例程运行后的图像如下图

image


第三章就到这里啦,祝大家学习能有所收获!😀

posted @ 2021-08-21 17:38  Dragonet-Z  阅读(1097)  评论(0编辑  收藏  举报