《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等等,对比生成的图像,灰度值大的区域会被适当地剪切
例程运行后的图像如下图

第三章就到这里啦,祝大家学习能有所收获!
《HALCON数字图像处理》第三章笔记的更多相关文章
- 《APUE》第三章笔记(1)
以下内容是我看<APUE>第二版第三章的笔记,有错还希望指出来,谢谢. unbuffered I/O,跟buffered I/O相对,buffered I/O就是 ISO C标准下的标准输 ...
- 《APUE》第三章笔记(3)
文件共享 UNIX系统支持在不同进程中共享打开的文件,首先先用一幅apue的图来介绍一下内核用于I/O文件的数据结构: 如图所见,一个进程都会有一个记录项,记录项中包含有一张打开文件描述符表,每个描述 ...
- 《APUE》第三章笔记(2)
read函数 调用read函数从打开的文件中读数据. #include <unistd.h> ssize_t read(int filedes, void *buf, size_t nby ...
- 《HALCON数字图像处理》第一、二章笔记
目录 第一章 绪论 1.1 图像和图像处理 1.1.1 图像 1.1.2 数字图像 1.1.3 图像处理及其发展过程 1.2 数字图像处理的步骤和方法 1.3 数字图像处理系统的硬件组成 1.4 数字 ...
- 数字图像处理(MATLAB版)学习笔记(2)——第2章 灰度变换与空间滤波
0.小叙闲言 1.本章整体结构 2.书中例子 例2.1 主要是使用函数imadjust,来熟悉一下灰度处理,体验一把 >> imread('myimage.jpg'); >> ...
- 数字图像处理(MATLAB版)学习笔记(1)——第1章 绪言
0.下定决心 当当入手数字图像处理一本,从此开此正式跨入数字图像处理大门.以前虽然多多少少接触过这些东西,也做过一些相关的事情,但感觉都不够系统,也不够专业,从今天开始,一步一步地学习下去,相信会有成 ...
- c语言数字图像处理(三):仿射变换
仿射变换及坐标变换公式 几何变换改进图像中像素间的空间关系.这些变换通常称为橡皮模变换,因为它们可看成是在一块橡皮模上印刷一幅图像,然后根据预定的一组规则拉伸该薄膜.在数字图像处理中,几何变换由两个基 ...
- HBase in Action前三章笔记
近期接触HBase,看了HBase In Action的英文版.開始认为还行,做了些笔记.可是兴许看下去,越来越感觉到实战这本书比較偏使用上的细节,对于HBase的具体设计涉及得很少.把前三章的一些笔 ...
- 【转】《APUE》第三章笔记(4)及习题3-2
原文网址:http://www.cnblogs.com/fusae-blog/p/4256794.html APUE第三章的最后面给出的函数,现在还用不着,所以,先留个名字,待到时候用着了再补上好了. ...
随机推荐
- Shiro 安全框架详解一(概念+登录案例实现)
shiro 安全框架详细教程 总结内容 一.RBAC 的概念 二.两种常用的权限管理框架 1. Apache Shiro 2. Spring Security 3. Shiro 和 Spring Se ...
- jboss7学习2-jboss7入门(端口和访问的ip问题)
1.下载地址: http://www.jboss.org/jbossas/downloads ,下载Certified Java EE 6 Full Profile版本. 2.解压 jboss-as- ...
- 防止自己的页面不被其他网站的页面的iframe引用
方法用二: 一.设置http请求头的X-Frame-Options: X-Frame-Options可以设置三个值 1.DENY 代表页面不会能被嵌入到iframe或者frame里 2.SAMEOR ...
- 微信小程序支付框样式以及功能
1.页面代码 <view catchtap='showInputLayer' class="btn_pay">立即支付</view> <!-- 密码输 ...
- 通过面试题学JavaScript知识(1)
// a 是多少的时候 可以让下面的打印ok if(a == 1 && a == 2 && a ==3){ console.log('ok') } 分析1: == 比较 ...
- BootstrapBlazor实战 Chart 图表使用(1)
BootstrapBlazor组件 Chart 图表介绍 通过给定数据,绘画各种图表的组件 本文主要介绍三种图表使用:折线图,柱状图,饼图 1.新建工程 新建工程b06chart,使用 nuget.o ...
- Linux_文件传输工具_FileZilla
什么是FileZilla? FileZilla是一个免费开源的FTP软件,分为客户端版本和服务器版本,具备所有的FTP软件功能.可控性.有条理的界面和管理多站点的简化方式使得Filezilla客户端版 ...
- FastAPI(六十九)实战开发《在线课程学习系统》接口开发--修改密码
之前我们分享了FastAPI(六十八)实战开发<在线课程学习系统>接口开发--用户 个人信息接口开发.这次我们去分享实战开发<在线课程学习系统>接口开发--修改密码 我们梳理一 ...
- Wireshark-过滤器-数据包解析
目录 过滤器 数据包解析 参考 推荐阅读: https://www.cnblogs.com/zwtblog/tag/计算机网络/ 过滤器 显示过滤器 和 捕获过滤器,俩者使用非常类似. 在Wiresh ...
- 自己写的一个Hash文件校验软件
原因 学校网络安全课讲到了Hash函数,老师提了一句上机操作的时候可以用自己的写的文件校验软件,所以我干脆就自己写一个. 说明 支持算法 MD5 SHA1 SHA256 SHA512 SHA384 为 ...