《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第三章的最后面给出的函数,现在还用不着,所以,先留个名字,待到时候用着了再补上好了. ...
随机推荐
- IDEA修改代码后不用重新启动项目即可刷新
1.File--Settings--Build 2.Build,Execution,Deplyment--Compiler 3.选中打勾 "Build project automatical ...
- 一篇文章带你整明白HTTP缓存知识
最近看了很多关于缓存的文章, 每次看完,看似明白但是实际还是没明白,这次总算搞明白协商缓存是怎么回事了 首先,服务器缓存分强制缓存和协商缓存(也叫对比缓存) 强制缓存一般是服务端在请求头携带字段Exp ...
- 将子分支代码merge到主分支master分支
1.首先切换到子分支: git checkout develop2.使用git pull 把分支代码pull下来: git pull3.切换到主分支: git checkout master4.把分支 ...
- Servlet学习记录
个人认为servlet属于一种控制程序,可以处理浏览器的请求并做出对应的回应.我们经常使用的是让一个类去继承HttpServlet,然后在doget或者dopost里面写东西. 目前我个人常在doge ...
- Spring原始注解开发-02
使用@Repository.@Service.@Controller注解配置,使其更加清晰属于哪一层,因为我是模拟的web层,所有没有使用@Controller注解,后面结合web开发会使用到 1.创 ...
- 轻量化安装 TKEStack:让已有 K8s 集群拥有企业级容器云平台的能力
关于我们 更多关于云原生的案例和知识,可关注同名[腾讯云原生]公众号~ 福利: ①公众号后台回复[手册],可获得<腾讯云原生路线图手册>&<腾讯云原生最佳实践>~ ②公 ...
- 解决一次calico异常情况,pod之间访问pod ip不通
k8s 集群采用二进制安装,cni网络插件用calico通讯问题描述:发现有些pod不是很正常例如: ht13.node正常系统采样 [root@ht6 ~]# cat /etc/redhat-rel ...
- 第十三届蓝桥杯省赛C/C++ B组
@(第十三届蓝桥杯省赛C/C++B组) A顺子日期 答案是1478 B顺子日期 答案14(如果012算的话) C刷题统计 数据范围1e18,所以不能直接暴力,先取余,再暴力剩下的 #include&l ...
- 打基础丨Python图像处理入门知识详解
摘要:本文讲解图像处理基础知识和OpenCV入门函数. 本文分享自华为云社区<[Python图像处理] 一.图像处理基础知识及OpenCV入门函数>,作者: eastmount. 一.图像 ...
- 企业级 Web 开发的挑战
本文翻译自土牛Halil ibrahim Kalkan的<Mastering ABP Framework>,是系列翻译的起头,适合ABP开发人员或者想对ABP框架进行深入演进的准架构师. ...