1、read_image (Image,'F:/image/001.bmp')读入图像。
2、threshold(Image,region,100,,200)阈值分割,获取区域。
3、dev_close_window()关闭当前图形窗口。
4、dev_open_window(0,0,640,480,'black', WindowHandle)打开一个新的图像窗口。
以上便是用halcon实现各种公式的方法。
HALCON是德国MVtec公司开发的一套完善的标准的机器视觉算法包,拥有应用广泛的机器视觉集成开发环境。它节约了产品成本,缩短了软件开发周期——HALCON灵活的架构便于机器视觉,医学图像和图像分析应用的快速开发。
HALCON对于机器视觉的学习者、开发者而言并不陌生,称其为机器视觉领域第一软件,亦无可厚非。HALCON对于视觉系统的控制、图像的处理和分析都能够较好的实现,尤其是各种图像处理算法。但就其本身而言,开发用户界面并不理想。用户界面以及对于其他底层的控制,比如和底层电路板、PLC等的控制和通信,可通过VC++、VB等进行开发。方便的是,HALCON恰恰能够被这些开发工具所调用,它支持C、C++、VB、JAVA等等。
刚开始结合VC++结合HALCON进行学习和开发时,因为软件方面的薄弱,对如何在VC++中如何调用HALCON感到不知所措,也在网上找了一些资料,资料较少,基本内容相同,或许能用,但始终对于笔者个人而言不太灵光。后来在一位软件同事的指导下,对其有了较为深刻的了解,其实说到底对软件工程师而言这是一件很简单的事,也就是将HALCON的库导入VC++。
以下,针对初学者一步步介绍,以MFC作为开发工具。
在Visual Studio中新建项目选择Visual C++下的MFC,其中的MFC应用程序,建立过程不赘述。本文以Visual Studio 2005为例。
打开HALCON安装目录(以HALCON7.0为例,后面的版本也相同),如下图1所示:
将其中的include文件夹整个拷贝至所建MFC项目工作目录下,如下图2所示:
同样,将HALCON的LIB文件拷贝到所建MFC项目工作目录下,因使用C++进行开发,所以选择X:Program FilesMVTecHALCONlibi586-nt4下的halconcpp.lib,这里X:为安装盘符
打开stdafx.h,在文件中空白位置处,加入
#include "include/cpp/HalconCpp.h"
#prama comment(lib,"halconcpp.lib")
下一步,点击项目下的属性,如下图6所示:
点开配置属性中的C/C++,如下图7所示:
当点在附加包含目录右侧空白框时,会出现的图标,点开,如下图8所示:
点击新建行,将所建MFC项目工程目录下的include文件夹的地址输入,也就是刚才我们拷贝过去的那个文件夹
最后一步,在需要使用HALCON库的地方,将其头文件导入,以****Dlg.cpp为例
这样我们就算成功在VC++/MFC中导入了HALCON库文件,就可以调用HALCON的函数,使用其强大的算法。另外,单纯执行上述步骤后,按F5启动调试,应该是不会有任何的ERROR和WARNING的。此方法同样适用于VB,在此不赘述,VB的开发者可自行尝试。
在Halcon中,图像是由像素组成的,一般的算法也都是基于像素来进行处理,所以其中Image和Region都是以像素为最小单位,XLD用来表示亚像素的轮廓或者多边形。
XLD的特征大部分跟Region很像,很多算子都是在Region的算子后加上_xld。其主要的特征如下:
1.get_contour_xld(Contour : : : Row, Col)
功能: 返回XLD轮廓的坐标;
输入: XLD对象Contours;
输出: 坐标值Row和Col;
2.get_lines_xld(Polygon : : : BeginRow, BeginCol, EndRow, EndCol, Length, Phi)
功能: 返回一个XLD多边形的数据(以线形式);
输入: 多边形XLD对象Polygon ;
输出: 直线的起点坐标、终点坐标、长度和角度;
3.get_parallels_xld(Parallels : : : Row1, Col1, Length1, Phi1, Row2, Col2, Length2, Phi2)
功能: 返回一个XLD平行数据(以线形式);
输入: 两平行线XLD对象Parallels ;
输出: Row1, Col1, Length1, Phi1, 两平行线第一条两端点坐标与线长,线方向;
输出: Row2, Col2, Length2, Phi2两平行线第二条两端点坐标与线长,线方向;
4.get_polygon_xld(Polygon : : : Row, Col, Length, Phi)
功能: 返回一个XLD多边形的数据;
输入: 多边形XLD对象Polygon ;
输出: 多边形每个顶点坐标Row,Col、每条边的长度和角度;
1.gen_circle_contour_xld( : ContCircle : Row, Column, Radius, StartPhi, EndPhi, PointOrder, Resolution : )
功能: 根据相应的圆或者圆弧创建XLD;
输入: 圆弧的圆心坐标,半径,起始角度和终止角度 ;
输入: 沿着圆弧点的方向(PointOrder),可选“positive”和“negative”;
输出: 创建的XLD对象ContCircle;
2.gen_contour_nurbs_xld( : Contour : Rows, Cols, Knots, Weights, Degree, MaxError, MaxDistance : )
功能: 将NURBS曲线转换为XLD轮廓;
输入: NURBS曲线的参数 ;
输出: 近似NURBS曲线的XLD轮廓;
3.gen_contour_polygon_rounded_xld( : Contour : Row, Col, Radius, SamplingInterval : )
功能: 根据一个带圆角的多边形(以元组形式给出)创建一个XLD轮廓;
输入: 多边形参数 ;
输出: 多边形生成的XLD轮廓;
4.gen_contour_polygon_xld( : Contour : Row, Col : )
功能: 根据一个多边形(以元组形式给出)创建一个XLD轮廓;
输入: 多边形点坐标Row,Col ;
输出: 多边形生成的XLD轮廓;
5.gen_contour_region_xld(Regions : Contours : Mode : )
功能: 根据区域Region创建XLD轮廓;
输入: 区域Region ;
输入: 模式Mode,“Center”,以边界像素的中心作为轮廓点;“border”,以边界像素的外边界作为轮廓点;“border_holes”,获取外边界同时可以获得所有孔的轮廓 ;
输出: 生成的XLD轮廓;
6.gen_contours_skeleton_xld(Skeleton : Contours : Length, Mode : )
功能: 将骨架转换为XLD轮廓(contour);
输入: 轮廓骨架Skeleton ;
输入: 提取轮廓线包含的最小点数;
输入: 输入过滤模式( 'filter', 'generalize1', 'generalize2');
'filter' ,因为轮廓线在端点被分割,所以会存在一种情况,就是即使很长的轮廓线也可能被分割成很多的短线,即使他们的长度大于设定参数Length
'generalize1',这种模式下,就可以避免长的轮廓被分割,而且长度小于参数Length的线段会被舍弃;
'generalize2' ,那么短的线段会被保留下来,只要线段有两个端点,即使长度小于参数Length,也会被保留。
输出: 生成的XLD轮廓;
7.gen_cross_contour_xld( : Cross : Row, Col, Size, Angle : )
功能: 根据每个输入点交叉的形状创键一个XLD轮廓(contour);
输入: 所有交叉点的坐标Row、Col ;
输入: 交叉点的大小;
输入: 每个交叉点的角度Angle;
输出: 生成的XLD轮廓Cross ;
8.gen_ellipse_contour_xld( : ContEllipse : Row, Column, Phi, Radius1, Radius2, StartPhi, EndPhi, PointOrder, Resolution : )
功能: 根据相应的椭圆弧创建一个XLD轮廓(contour);
输入: 椭圆弧的参数Row、Col、Phi ;
输入: 轮廓点的顺序,“positive”和“negative”;
输入: 相邻轮廓点的最大距离Resolution;
输出: 生成的XLD轮廓ContEllipse ;
9.gen_nurbs_interp( : : Rows, Cols, Tangents, Degree : CtrlRows, CtrlCols, Knots)
功能: 根据给定的插值点,创建NURBS曲线的控制数据;
输入: 所有交叉点的坐标Row、Col ;
输入: 交叉点的大小;
输入: 每个交叉点的角度Angle;
输出: 生成的XLD轮廓ContEllipse ;
10.gen_parallels_xld(Polygons : Parallels : Len, Dist, Alpha, Merge : )
功能: 提取平行的XLD多边形(polygon);
输入: 待提取的多边形轮廓 Polygons ;
输入: 提取长度超过Len的线段,投影距离小于Dist;
输入: 多边形最大角度差Alpha和是否合并相邻的平行关系Merge;
输出: 提取的平行XLD轮廓Parallels ;
11.gen_polygons_xld(Contours : Polygons : Type, Alpha : )
功能: 根据多边形近似创建XLD轮廓(contour);
输入: 想要逼近的XLD轮廓Contours ;
输入: 逼近的类型Type,主要为“ramer”算法;
输入: 逼近的阈值是通过Alpha 设置的;
输出: 近似后的轮廓Polygons ;
12.gen_rectangle2_contour_xld( : Rectangle : Row, Column, Phi, Length1, Length2 : )
功能: 创建一个Rect2矩形XLD轮廓(contour);
输入: Rect2的参数;
输出: 生成的XLD轮廓Rectangle ;
13.mod_parallels_xld(Parallels, Image : ModParallels, ExtParallels : Quality, MinGray, MaxGray, MaxStandard : )
功能: 提取封闭区域内的平行XLD多边形(polygon);
输入: 输入的XLD轮廓Parallels;
输入: 最小品质因数(并行度的度量)Quality;
输入: 设定最小灰度,最大灰度和最大标准偏差MaxStandard ;
输出: 返回的平行的XLD轮廓ModParallels;
输出: 扩展的XLD轮廓ExtParallels ;
1.affine_trans_contour_xld(Contours : ContoursAffineTrans : HomMat2D : )
功能: 对XLD轮廓(contour)进行任意二维仿射变换;
输入: 圆弧的圆心坐标,半径,起始角度和终止角度 ;
输入: 沿着圆弧点的方向(PointOrder),可选“positive”和“negative”;
输出: 创建的XLD对象ContCircle;
2.gen_contour_nurbs_xld( : Contour : Rows, Cols, Knots, Weights, Degree, MaxError, MaxDistance : )
功能: 将NURBS曲线转换为XLD轮廓;
输入: NURBS曲线的参数 ;
输出: 近似NURBS曲线的XLD轮廓;
3.gen_contour_polygon_rounded_xld( : Contour : Row, Col, Radius, SamplingInterval : )
功能: 根据一个带圆角的多边形(以元组形式给出)创建一个XLD轮廓;
输入: 多边形参数 ;
输出: 多边形生成的XLD轮廓;
4.gen_contour_polygon_xld( : Contour : Row, Col : )
功能: 根据一个多边形(以元组形式给出)创建一个XLD轮廓;
输入: 多边形点坐标Row,Col ;
输出: 多边形生成的XLD轮廓;
5.gen_contour_region_xld(Regions : Contours : Mode : )
功能: 根据区域Region创建XLD轮廓;
输入: 区域Region ;
输入: 模式Mode,“Center”,以边界像素的中心作为轮廓点;“border”,以边界像素的外边界作为轮廓点;“border_holes”,获取外边界同时可以获得所有孔的轮廓 ;
输出: 生成的XLD轮廓;
6.gen_contours_skeleton_xld(Skeleton : Contours : Length, Mode : )
功能: 将骨架转换为XLD轮廓(contour);
输入: 轮廓骨架Skeleton ;
输入: 提取轮廓线包含的最小点数;
输入: 输入过滤模式( 'filter', 'generalize1', 'generalize2');
'filter' ,因为轮廓线在端点被分割,所以会存在一种情况,就是即使很长的轮廓线也可能被分割成很多的短线,即使他们的长度大于设定参数Length
'generalize1',这种模式下,就可以避免长的轮廓被分割,而且长度小于参数Length的线段会被舍弃;
'generalize2' ,那么短的线段会被保留下来,只要线段有两个端点,即使长度小于参数Length,也会被保留。
输出: 生成的XLD轮廓;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)