我在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. in a frame because it set 'X-Frame-Options' to 'sameorigin'

    不是所有网站都给  iframe嵌套的,  有的网站设置了  禁止嵌套!!! 浏览器会依据X-Frame-Options的值来控制iframe框架的页面是否允许加载显示出来, 看你们公司这么设置了!! ...

  2. 库存管理系统实现 C语言课设

    1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 //定义一个商品结构体 6 ...

  3. Mybatis-自定义类型处理器

    类型转换器:mybatis中有一些常用的类型转换器,比如把Java中的short类型转换为mysql中的short类型:但是如果现在是Java中的Date类型,但是我想要存储到数据库中转换为Long类 ...

  4. Struts2封装获取表单数据方式

    一.属性封装 1.创建User实体类` package cn.entity; public class User { private String username; private String p ...

  5. java四种访问修饰符及各自的权限

    1.public,即共有的,是访问权限限制最宽的修饰符.被public修饰的类.属性.及方法不仅可以跨类访问,而且可以跨包访问. 2. protected,即保护访问权限,是介于public和priv ...

  6. &&与&,||与| 区别

    1. &&和&都是表示与,区别是&&只要第一个条件不满足,后面条件就不再判断. 而&要对所有的条件都进行判断. public class Test { ...

  7. jsp中c:forEach使用

    首先需要在jsp中引入<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> ...

  8. selenium打开指定Chrome账号

    selenium打开指定Chrome账号 获取User Data路径 打开目标Chrome,在搜索栏输入chrome://version,找到"个人资料路径". 这里获取到的路径为 ...

  9. 几种比较经典的波形及其FFT变换(正弦波,三角波,方波和锯齿波)

    之前上学时我的信号学得最差了,主要原因还是我高数学得不怎么样.可能是人总敬畏自己最不会的,所以我觉得我学过诸多科目中,数学是最博大精深而最妙的,从最开始的一次函数到反比例函数,二次三次函数和双曲线,椭 ...

  10. 2021.11.03 P2886 [USACO07NOV]Cow Relays G(矩阵+floyed)

    2021.11.03 P2886 [USACO07NOV]Cow Relays G(矩阵+floyed) [P2886 USACO07NOV]Cow Relays G - 洛谷 | 计算机科学教育新生 ...