《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第三章的最后面给出的函数,现在还用不着,所以,先留个名字,待到时候用着了再补上好了. ...
随机推荐
- java的内存泄露是如何发生的,如何避免和发现
java的垃圾回收与内存泄露的关系:[新手可忽略不影响继续学习] 马克-to-win:上一节讲了,(i)对象被置成null.(ii)局部对象(无需置成null)当程序运行到右大括号.(iii)匿名对象 ...
- Java List转为Object组
代码: private Object[] ListToObject(List<String> list){ Object [] tem = new Object[]{}; int size ...
- JavaScript实现带正则表达式的表单校验(校验成功后跳转)
运行结果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...
- Vulnhub 之 Earth
靶机地址:https://www.vulnhub.com/entry/the-planets-earth,755/ Kali IP:192.168.56.104 下载OVA文件后,直接通过Virtua ...
- Factorials and Powers of Two
分析:我们可以看出这道题目的描述并不是很复杂,就是说对于一个给定的整数n,我们能否把他拆成k个powerful的数,也就是说这k个数要么是2的幂次,要么是某个数的阶乘,并且我们要让当前的k越小越好:然 ...
- cat /proc/cpuinfo 讲解
查看cpu信息有什么用呢,我们来看看到底有哪些用处:1.和云服务提供商核算成本,现在基本是cpu和内存的费用最大,硬盘大小几乎被忽略了2.我们写程序时候是会关注多核还是单核的,否则不能充分利用多线程等 ...
- C++五子棋(二)——游戏界面与棋子渲染
准备 我们首先要在程序中定义一个名为drawPNG的函数,用于输出png格式图片并使背景透明 引入头文件(需要提前安装EasyX) #include <graphics.h> 定义函数 d ...
- 1.Markdown语法
Markdown学习 一.标题:(# +标题名字) 标题 三级标题 四级标题 二.字体 (空格内容前后的空格删掉) Hello,World! **粗体** Hello,World! *斜体* Hell ...
- 国产化之银河麒麟.netcore3.1访问https服务的两个问题
背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,数据库使用达梦V8,CPU平台的范围包括x64.龙芯.飞腾.鲲鹏等. 考虑到这些基础产品对.NETCore的支持,最终选择了3.1版 ...
- ImageKnife组件,让小白也能轻松搞定图片开发
本期我们给大家带来的是开发者周黎生的分享,希望能给你的HarmonyOS开发之旅带来启发~ 图片是UI界面的重要元素之一, 图片加载速度及效果直接影响应用体验.ArkUI开发框架提供了丰富的图像处理能 ...