语法与算子代码
*光标指向算子函数CTRL+shift+space打开算子窗口可以图形化设置算子的各种参数。
读入图片
read_inage(Image,'E:/lena.bmp')
*
*当源文件和图片在同一目录下面的时候,可以不用绝对路径
*read_inage(Image,'lena.bmp')
![](https://img-blog.csdnimg.cn/direct/92068d9709f74f3ea0f8c128756faea6.png)
*Halcon中的注释采用的是 * 的形式。
stop()
*代码中加入stop(),程序运行到此处自动暂停,方便检查运行中间的状态
查看函数帮助文档
光标移动到函数上,按下F1获取帮助。
HDevelover界面布局
operators 算子
图像采集
获取非实时图像
利用read_image算子进行读取程序
利用快捷键
按住CTRL+R打开读取图像对话窗口
利用采集助手批量读取
菜单栏助手,打开新的Image Acquisition,点击“资源”选项卡下的“路径选择”,点击“代码生成”选项卡下的“插入代码”
![](https://img-blog.csdnimg.cn/direct/53b3d292b09f47e599fcc2e31f02b3db.png)
获取实时图像
两种主要的获取实时图像的方式:
通过Halcon自带的采集接口获取
异步读取与同步读取的区别
图像从相机主存到采集卡存储器再到上位机内存
异步读取
图像从采集设备获取,非实时,取像与处理并行,对图像处理时间把控比较严,相机得到取像的指令后就将图像传输到采集卡中。程序根据自身运行情况,在对应位置触发从采集卡中读取图像到内存之中。这种方式需要调试相机取像的信号,使得程序从采集卡中取得的图像是预定时间的图像。
同步读取
通过相机取像,实时,取像与处理是串行的,取像周期长。相机取得图像,程序的下一步一定会取走图像,存在类似互锁的机制使得两个动作依次发生。
通过相机配套的SDK获取
数据结构
Iconic 图标
Image 图像
单通道(黑白图像)、三通道(彩色图像)、多通道(遥感图像、纹理分析)
Region 区域
指图像中的一块区域
在Halcon中将图像转化为区域的两种方式
利用阈值分割threshold算子进行转化
使用灰度直方图进行转化
Extended Line Description(XLD)
亚像素精度轮廓,指图像中某一块区域的轮廓。在Halcon中查看时通过特征检测选择XLD
Control 控制
String 字符
Integer 整型
Real 实型
Handle 句柄
Tuple (类似数组)
c:=[1,2,'hello']
*tuple内存储的数据不一定是同一类型
在Halcon中,变量不需要申明就可以使用。
read_image(Image,'claudia')
CopyImage:=Image
*不需要申明
基本语句
if语句
if(XXXX)
XXXX
elseif(XXXX)
XXXX
else
XXXX
endif
*不同于C语言。在Halcon中,a==X和a=X表示的意思是一样的,都是判断的意思
*不等于的情况同C语言可用!=,也可以用#
正则表达式
if(XXX and XXX)
XXX
endif
*与
if(XXX or XXX)
XXX
endif
*或
if(XXX xor XXX)
XXX
endif
*异或
for循环
array:=[]
for i:=1 to 10 by 1
array[i-1]:=i
endfor
*array = [1,2,3,4,5,6,7,8,9,10]
*i = 11
*若array[i]:=i
*array = [0,1,2,3,4,5,6,7,8,9,10]
*若涉及到数组位置i的访问,而未对小于i的位置赋值,则会自动赋值为0
*提到了新的写法array = [array,1]但是不知道性能如何
break和continue
*跳出当前语句的方式类似C语言
array:=[]
for i:=1 to 10 by 1
if(i==3)
continue
endif
if(i==7)
break
endif
array[i-1]:=i
endfor
*array=[1,2,4,5,6]
while循环与do while 语句
Flag:=0
array:=[]
Number:=5
i:=0
while(Flag==0)
if(i==Number)
Flag:=1
endif
array:=[array,1]
i:=i+1
endwhile
*array=[0,1,2,3,4,5]
*Halcon中没有do while 语句
*使用repeat and until语句实现do while 语句功能
Flag:=1
array=[]
i:=0
repeat
array:=[array,i]
i:=i+1
until(Flag==1)
*array=[0]
switch语句
*switch case和C语言中类似
result:=''
Index:=XXX(一个数)
switch(Index)
case 1:
result:=resule+'1'
break
*正确写法
case 2:
result:=result+'2'
*不加break会导致后面的语句被执行
case 3:
case 4:
result:=result+'4'
break
default:
result:='-1'
endswitch
ROI(region of interest)
感兴趣区域,从被处理的图像以方框,圆,椭圆,不规则多边形等方式勾勒出需要处理的区域。这个区域是你图像分析所关注的重点。
可以减少计算量,加快图像处理速度,提高效率。
第一步:选择关注区域
通过原始图像处理的得到特定区域。此时不叫ROI,只是形状或像素范围。
第二步:裁剪区域
使用reduce_domain算子将其截取出来成为一副单独的图像。
read_image(Image,'claudia')
gen_rectangle1(Region1,288,115,332,204)
*生成一个矩形的区域
reduce_domain(Image,Region1,ImageReduced)
*得到一个图片,其中矩形区域内是同原图一样,其他部分为黑色
********************************************************
read_image(Image,'claudia')
get_image_size(Image,Width,Height)
dev_open_window(0,0,Width,Height,'black',WindowHandle)
dev_display(Image)
draw_rectangle1(WindowHandle,Row1,Colum1,Row2,Colum2)
*交互式的生成一个矩形区域,表示在Window Handle中绘制,输出4个参数描述矩形对角线两点的参数
gen_rectangle(Region1,Row1,Colum1,Row2,Colum2)
reduce_domain(Image,Region1,ImageReduced)
*得到一个图片,其中矩形区域内是同原图一样,其他部分为黑色
*********************************************************
类似的
gen_circle(Circle,Height/2,Width/2,100)
或者
draw_circle(WindowHandle,Row,Colum,R)
gen_circle(Circle,Row,Colum,R)
********************************************************
draw_rectangle2 绘制斜的长方形
也提供了绘制多边形的方法
通过reduce_domain生成的ROI,在范围内不变,范围外的像素变黑,图片的尺寸不发生变化
交互式生成ROI
第一步:点击‘创建新的ROI’,打开ROI窗口
第二步:交互式创建区域。点击插入代码吗,实现创建ROI
绘制多个图形的情况:
![](https://img-blog.csdnimg.cn/direct/0fd46138733942b2bc933b88686db639.png)
![](https://img-blog.csdnimg.cn/direct/252cae9ba830482cb58ece685a9b0002.png)
图像的变换与矫正
由于各种因素,实际获得的图片需要调整。
通过数学建模方法来描述图像位置、形状、大小等已知条件,利用这些条件来确定模型参数,根据模型对图像进行几何校正。
图像的平移、旋转和缩放
齐次坐标(Homogenous Coordinate)
在原坐标的基础上,添加一个维度,实现各种变换。[x,y]->[x,y,1]
图像平移
图像旋转
图像缩放
几何变换
等距变换
仅平移和旋转(三个自由度)
相似变换(similarity Transformation)
由一个平面/立体图形变换到另一个平面/立体图形,在改变的过程中保持形状不变(大小方向和位置可变),任何相似变换都可以分解为等比例缩放、平移、旋转的组合。(四个自由度)
![](https://img-blog.csdnimg.cn/direct/04a5906d34b04059abf391f27dbdb85e.png)
仿射变换(Affine Transformation)
由一个平面/立体图形变换到另一个平面/立体图形,在改变的过程中保持直线和平行线不变(平行线映射为平行线),任何仿射变换都可以分解为缩放、平移、旋转和切边(Shearing)的组合。(六个自由度)
![](https://img-blog.csdnimg.cn/direct/60c8f2b7563148498c1e1450c2c8abf0.png)
投影变换(Projective Transformation)(单应性变换)
在变换过程中,直线映射为直线(但不一定保证平行度)任何二维投影变换都可以用3*3可逆矩阵表示,而任何三维投影变换都可以用4*4可逆矩阵表示。
不同视角的同一物体,在像素坐标系中的变换。
单应性不严谨定义:用无镜头畸变的相机从不同位置拍摄同一平面物体的图像之间存在单应性,可以用投影变换表示。
分为透视投影和平行投影。透视投影符合人眼和照相机的成像规律。
如图在不考虑其他变化的情况下,通过v1,v2,s三个参数对坐标进行变换,最后通过归一化,得到x,y新的坐标。
投影变换矩阵的求法
有8个自由度,需要8个方程来进行约束,所以至少需要4个点变换前后的坐标才能求出所有的未知数。
算法:Levenberg-Marquardt迭代(知道即可,实际有函数库实现)
1.打印一张棋盘格标定图纸,将其贴在平面物体的表面;
2.拍摄一组不同方向棋盘格的图片,可以通过移动相机实现,也可以移动标定图片来实现。
3.对于每张拍摄的棋盘图片,检测图片中所有棋盘格的特征点(角点)
定义打印的棋盘图纸位于世界坐标系Zw=0的平面上
世界坐标系原点位于棋盘图纸的固定一角(图中黄点)
像素坐标系原点位于图片左上角
4.棋盘标定图纸中所有角点的空间坐标是已知的,这些角点对应在拍摄的标定图片中的角点的像素坐标也是已知的;
利用N>=4个匹配点对(越多计算结果越鲁棒),就可以根据LM等优化方法得到其单应矩阵H
投影变换的作用
图像校正、图像拼接、相机位姿估计、视觉SLAM等
![](https://img-blog.csdnimg.cn/direct/7bbebab5db24426980d180d998bc1158.png)
Halcon中图像投影变换的算子
![](https://img-blog.csdnimg.cn/direct/b52dbb30f59b411a8eb6d0246baa8254.png)
Halcon中的平移变换
Halcon中的旋转变换
Halcon中的缩放
![](https://img-blog.csdnimg.cn/direct/e8b43ee073d540eca6cdf4cdb28a130e.png)
相关算子