我在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软件通常里面有四个控制窗口,程序编辑器、算子窗口、变量窗口和图形窗口

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





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

* 遍历文件夹
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)

关键算子说明:

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_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

显示效果如下

HALCON图像转换

  1. RGB转灰度图

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

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

用的是region_to_mean(Regions, Image : ImageMean : : ),可以利用这个算子将得到的ImageMean的灰度值设置成region和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等等,对比生成的图像,灰度值大的区域会被适当地剪切

例程运行后的图像如下图


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

《HALCON数字图像处理》第三章笔记的更多相关文章

  1. 《APUE》第三章笔记(1)

    以下内容是我看<APUE>第二版第三章的笔记,有错还希望指出来,谢谢. unbuffered I/O,跟buffered I/O相对,buffered I/O就是 ISO C标准下的标准输 ...

  2. 《APUE》第三章笔记(3)

    文件共享 UNIX系统支持在不同进程中共享打开的文件,首先先用一幅apue的图来介绍一下内核用于I/O文件的数据结构: 如图所见,一个进程都会有一个记录项,记录项中包含有一张打开文件描述符表,每个描述 ...

  3. 《APUE》第三章笔记(2)

    read函数 调用read函数从打开的文件中读数据. #include <unistd.h> ssize_t read(int filedes, void *buf, size_t nby ...

  4. 《HALCON数字图像处理》第一、二章笔记

    目录 第一章 绪论 1.1 图像和图像处理 1.1.1 图像 1.1.2 数字图像 1.1.3 图像处理及其发展过程 1.2 数字图像处理的步骤和方法 1.3 数字图像处理系统的硬件组成 1.4 数字 ...

  5. 数字图像处理(MATLAB版)学习笔记(2)——第2章 灰度变换与空间滤波

    0.小叙闲言 1.本章整体结构 2.书中例子 例2.1 主要是使用函数imadjust,来熟悉一下灰度处理,体验一把 >> imread('myimage.jpg'); >> ...

  6. 数字图像处理(MATLAB版)学习笔记(1)——第1章 绪言

    0.下定决心 当当入手数字图像处理一本,从此开此正式跨入数字图像处理大门.以前虽然多多少少接触过这些东西,也做过一些相关的事情,但感觉都不够系统,也不够专业,从今天开始,一步一步地学习下去,相信会有成 ...

  7. c语言数字图像处理(三):仿射变换

    仿射变换及坐标变换公式 几何变换改进图像中像素间的空间关系.这些变换通常称为橡皮模变换,因为它们可看成是在一块橡皮模上印刷一幅图像,然后根据预定的一组规则拉伸该薄膜.在数字图像处理中,几何变换由两个基 ...

  8. HBase in Action前三章笔记

    近期接触HBase,看了HBase In Action的英文版.開始认为还行,做了些笔记.可是兴许看下去,越来越感觉到实战这本书比較偏使用上的细节,对于HBase的具体设计涉及得很少.把前三章的一些笔 ...

  9. 【转】《APUE》第三章笔记(4)及习题3-2

    原文网址:http://www.cnblogs.com/fusae-blog/p/4256794.html APUE第三章的最后面给出的函数,现在还用不着,所以,先留个名字,待到时候用着了再补上好了. ...

随机推荐

  1. java的内存泄露是如何发生的,如何避免和发现

    java的垃圾回收与内存泄露的关系:[新手可忽略不影响继续学习] 马克-to-win:上一节讲了,(i)对象被置成null.(ii)局部对象(无需置成null)当程序运行到右大括号.(iii)匿名对象 ...

  2. Java List转为Object组

    代码: private Object[] ListToObject(List<String> list){ Object [] tem = new Object[]{}; int size ...

  3. JavaScript实现带正则表达式的表单校验(校验成功后跳转)

    运行结果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...

  4. Vulnhub 之 Earth

    靶机地址:https://www.vulnhub.com/entry/the-planets-earth,755/ Kali IP:192.168.56.104 下载OVA文件后,直接通过Virtua ...

  5. Factorials and Powers of Two

    分析:我们可以看出这道题目的描述并不是很复杂,就是说对于一个给定的整数n,我们能否把他拆成k个powerful的数,也就是说这k个数要么是2的幂次,要么是某个数的阶乘,并且我们要让当前的k越小越好:然 ...

  6. cat /proc/cpuinfo 讲解

    查看cpu信息有什么用呢,我们来看看到底有哪些用处:1.和云服务提供商核算成本,现在基本是cpu和内存的费用最大,硬盘大小几乎被忽略了2.我们写程序时候是会关注多核还是单核的,否则不能充分利用多线程等 ...

  7. C++五子棋(二)——游戏界面与棋子渲染

    准备 我们首先要在程序中定义一个名为drawPNG的函数,用于输出png格式图片并使背景透明 引入头文件(需要提前安装EasyX) #include <graphics.h> 定义函数 d ...

  8. 1.Markdown语法

    Markdown学习 一.标题:(# +标题名字) 标题 三级标题 四级标题 二.字体 (空格内容前后的空格删掉) Hello,World! **粗体** Hello,World! *斜体* Hell ...

  9. 国产化之银河麒麟.netcore3.1访问https服务的两个问题

    背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,数据库使用达梦V8,CPU平台的范围包括x64.龙芯.飞腾.鲲鹏等. 考虑到这些基础产品对.NETCore的支持,最终选择了3.1版 ...

  10. ImageKnife组件,让小白也能轻松搞定图片开发

    本期我们给大家带来的是开发者周黎生的分享,希望能给你的HarmonyOS开发之旅带来启发~ 图片是UI界面的重要元素之一, 图片加载速度及效果直接影响应用体验.ArkUI开发框架提供了丰富的图像处理能 ...