halcon中的数据类型与语法结构 |
您所在的位置:网站首页 › 语法结构和语义结构一样吗 › halcon中的数据类型与语法结构 |
图像预处理 消除噪声mean_image/binomial_filter抑制小斑点或细线median_image平滑图像smooth_image平滑图像的同时保存边缘anisotropic_diffusion
遍历文件夹与文件选择
1)遍历文件夹: list_files( : : Directory, Options : Files) ![]() 2)文件格式筛选 tuple_regexp_select( : : Data, Expression : Selection)
示例: 1: * 遍历文件夹D:/资料库/Downloads 2: list_files ('D:/资料库/Downloads', ['files','follow_links'], ImageFiles) 3: 4: * 筛选bmp或jpg格式的文件 5: tuple_regexp_select (ImageFiles, ['\\.(bmp|jpg)$','ignore_case'], ImageFiles) 6: 7: * 依次读取图片 8: for Index := 0 to |ImageFiles| - 1 by 1 9: read_image (Image, ImageFiles[Index]) 10: 11: endfor(一)Halcon的语法结构特点 类似于Pascal 与 Visual Basic,大部分的语句是Halcon提供的算子,此外也包含了少部分的控制语句; 不允许单独声明变量; 提供自动的内存管理(初始化、析构及OverWrite),但句柄则需要显示释放; C++(算子模式) 通过代码导出,以C++为例,默认导出为算子型的语法结构,而非面向对象的;在此模式下,全部函数声明为全局类型,数据类型只需要用Hobject、HTuple两类类型进行声明; C++(面向对象) 可以以面向对象的方式重写代码,也即利用类及类的成员函数; 在这种模式下,控制变量的类型仍未HTuple,而图形数据可以由多种类型,如HImage等; 其他语言(略) HImage 可以查看halcon中类相关的内容
(二)Halcon的数据类型
两类参数: 1、图形参数Iconic (image, region, XLD) 2、与控制参数Control (string, integer, real, handle), 在Halcon算子的参数中,依次为:输入图形参数、输出图形参数、输入控制参数、输出控制参数;并且其输入参数不会被算子改变。 1、图形参数Iconic: (1)Images 在Halcon中,Image = Channel + Domain , 像素点存放在Channel矩阵中,根据ROI来描述Image。 Image相关操作: 输入:从文件、从设备 生成:外部图像数据、空内存区域; 显示:disp_image()图像首通道灰度图;disp_color() 彩色图;disp_channel()某特定通道;disp_obj() 自动判别类别; 缩放:set_part() 设置显示区域;set_part_style() 设置显示参数; 说明: Ø Multiple channels //多通道图像,可以是灰度图像或RGB图像 Ø Arbitrary region of interest //ROI区域图像 Ø Multiple pixel types(byte, (u)int1/2/4,real, complex, direction, cyclic, vector_field) byte, uint2 //灰度图像的标准编码 int1, int2 //Difference of two images or derivates with integer precision(??)int4 //两幅灰度图的频谱 direction //图片边缘的梯度方向 real //边缘提取及特定灰度值的轮廓 complex //图片频率分布 cyclic //Assigning one "gray" value to each color(??) vector_field //连续图形的光学流分布 (2)Regions 以行列坐标形式储存,有广泛的应用,特点是高效,可利用同态算子。比如用阈值对图像分割的结果,其他系统中称为BOLB,AREA等。 (3)Extended Line Description (XLD) 图像均用像素点保存,而像素点是整型的,不连续的,Halcon做了拓展,定义了亚像素(subpixel)的描述几何轮廓的对象:xld,主要用在亚像素测量的背景下,可用于如提取边缘、构建轮廓等等,xld在模板匹配、图形校准等多方面有重要的用途。 说明: Subpixel accurate line and edge detection(亚像素精度的线和边缘检测) Generic point list based data structure(依据数据结构产生点的表) Handling of contours, polygons, lines, parallels, etc.(对轮廓,多边形,线等进行操作) 2、控制参数Control: String类型变量由单引号’括起来;此外还有一些特殊字符; Boolean型变量包括 true ( = 1 )、 false ( = 0 ) ;不为零的整数将被认为true;但绝大多数的Halcon函数接受字符串型的表达:’true’‘false’,而非逻辑型表达; 此外,Halcon支持的类型还包括图形元组、控制变量元组及句柄: 元组的概念,使得可以用一个变量传递数个对象,可以由重载后的函数来进行处理;图形元组的下标从1开始,控制变量元组下标从0开始;句柄则可以用来描述窗体、文件等等,句柄不能是常量。
(三)Halcon的基本语句
1、标准赋值 Ø assign(Input, Result) //编辑形式,永远都是输入在前,输出在后 1: assign(sin(x) + cos(y), u)Ø Result := Input //代码形式 1: u := sin(x) + cos(y) //与之前的assign(sin(x) + cos(y), u)是等价的2、元组插入赋值 Ø insert(Tuple, NewValue, Index, Tuple) //编辑形式 1: Tuple := [1,2,3,4,5,6,7,8,9] 2: insert(Tuple,0,3,Tuple) 显示结果为:[1, 2, 3,0, 5, 6, 7, 8, 9]Ø Tuple[Index] := NewValue //代码形式 1: Tuple := [1,2,3,4,5,6,7,8,9] 2: Tuple[3]:=0 显示结果为:[1, 2, 3,0, 5, 6, 7, 8, 9]例程: 1: read_image (Mreut, 'mreut') //读入图像 2: threshold (Mreut, Region, 190, 255) //阈值化,输出阈值在190-255的Regions 3: Areas := [] //定义数组Areas 4: for Radius := 1 to 50 by 1 //循环 5: dilation_circle (Region, RegionDilation, Radius) //利用半径为Radius的圆对Region进行膨胀运算,输出 6: //RegionDilation,输出形式仍然为Region。 7: area_center (RegionDilation, Area, Row, Column) //输出区域的面积和中心像素坐标 8: Areas[Radius-1] := Area //对数组Areas的第Radius-1个元素进行赋值 9: endfor3、基本数组操作极其对应的算子 数组操作说明对应的算子t := [t1,t2]t1,t2连接成新的数组tuple_concati := |t|得到数组长度tuple_lengthv := t[i]选取第i个元素0 t greater thanØ t = t greater or equal Ø t = t equal Ø t # t not equal 逻辑操作符 Ø lnot l negation Ø l and l logical ’and’ Ø l or l logical ’or’ Ø l xor l logical ’xor’ 数学函数 Ø sin(a) sine of a Ø cos(a) cosine of a Ø tan(a) tangent of a Ø asin(a) arc sine of a in the interval [-p/2, p/ 2], a Î [-1, 1] Ø acos(a) arc cosine a in the interval [-p/2, p/2], a Î [-1, 1] Ø atan(a) arc tangent a in the interval [-p/2, p/2], a Î [-1, 1] Ø atan2(a,b) arc tangent a/b in the interval [-p, p] Ø sinh(a) hyperbolic sine of a Ø cosh(a) hyperbolic cosine of a Ø tanh(a) hyperbolic tangent of a Ø exp(a) exponential function Ø log(a) natural logarithm, a> 0 Ø log10(a) decade logarithm, a> 0 Ø pow(a1,a2) power Ø ldexp(a1,a2) a1 pow(2,a2) 其他操作(统计、随机数、符号函数等) Ø min(t) minimum value of the tuple Ø max(t) maximum value of the tuple Ø min2(t1,t2) element-wise minimum of two tuples Ø max2(t1,t2) element-wise maximum of two tuples Ø find(t1,t2) indices of all occurrences of t1 within t2 Ø rand(i) create random values from 0..1 (number specified by i) Ø sgn(a) element-wise sign of a tuple Ø sum(t) sum of all elements or string concatenation Ø cumul(t) cumulative histogram of a tuple Ø mean(a) mean value Ø deviation(a) standard deviation Ø sqrt(a) square root of a Ø deg(a) convert radians to degrees Ø rad(a) convert degrees to radians Ø real(a) convert integer to real Ø int(a) convert a real to integer Ø round(a) convert real to integer Ø number(v) convert string to a number Ø is_number(v) test if value is a number Ø abs(a) absolute value of a (integer or real) Ø fabs(a) absolute value of a (always real) Ø ceil(a) smallest integer value not smaller than a Ø floor(a) largest integer value not greater than a Ø fmod(a1,a2) fractional part of a1/a2, with the same sign as a1 Ø sort(t) sorting in increasing order Ø uniq(t) eliminate duplicates of neighboring values(typically used in combination with sort) Ø sort_index(t) return index instead of values Ø median(t) Median value of a tuple (numbers) Ø select_rank(t,v) Select the element (number) with the given rank Ø inverse(t) reverse the order of the values Ø subset(t1,t2) selection from t1 by indices in t2 Ø remove(t1,t2) Remove of values with the given indices Ø environment(s) value of an environment variable Ø ord(a) ASCII number of a character Ø chr(a) convert an ASCII number to a character Ø ords(s) ASCII number of a tuple of strings Ø chrt(i) convert a tuple of integers into a string (四)HDevelop language(结构语句)
1) if ... endif / if ... else ... endif / if ... elseif ... else ... endif 2) for ... endfor 3) while ... endwhile 4) repeat ... until(循环体至少被执行一次,直到满足条件时退出。等同于C语言的do...while语句) 此外,也有关键字 break、continue、return、exit、stop 用来控制语句的执行; stop:终止后面的循环,点击Step Over or Run button继续。 exit:终止Hdevelop程序段。 (五)异常处理 异常处理: try ... catch ... endtry:异常算子处理句柄 throw:允许处理用户定义的意外情况。 用MFC写的,我在捕获异常提时候,都需要在前面使用HException::InstallHHandler(&CPPExpDefaultExceptionHandler);才能全try{..}catch(HException &except){..} 生效 在VC中其实是靠不住的。例如下面的代码: try{BYTE * pch ;pch = ( BYTE * ) 00001234 ; // 给予一个非法地址 * pch = 6 ; // 对非法地址赋值,会造成Access Violation 异常}//...是捕捉任意类型的异常. catch ( ... ){AfxMessageBox ( " catched " ) ;}这段代码在debug下没有问题,异常会被捕获,会弹出”catched”的消息框。但在Release方式下如果选择了编译器代码优化选项,则 VC编译器会去搜索try块中的代码, 如果没有找到throw代码,他就会认为try catch结构是多余的, 给优化掉。这样造成在Release模式下,上述代码中的异常不能被捕获,从而迫使程序弹出错误提示框退出。 那么能否在release代码优化状态下捕获这个异常呢, 答案是有的。 就是__try, __except结构,上述代码如果改成如下代码异常即可捕获。 __try{BYTE * pch ;pch = ( BYTE * ) 00001234 ; // 给予一个非法地址 * pch = 6 ; // 对非法地址赋值,会造成Access Violation 异常}__except ( EXCEPTION_EXECUTE_HANDLER ){AfxMessageBox ( " catched " ) ;}但是用__try, __except块还有问题, 就是这个不是C++标准, 而是Windows平台特有的扩展。而且如果在使用过程中涉及局部对象析构函数的调用,则会出现C2712 的编译错误。 那么还有没有别的办法呢? 当然有, 就是仍然使用C++标准的try{}catch(..){}, 但在编译命令行中加入 /EHa 的参数。这样VC编译器不会把try catch模块给优化掉了。 (6)单摄像机标定In the reference manual,operator signatures are visualized in the following way: operator ( iconic input : iconic output : control input : control output )
在HALCON所有算子中,变量皆是如上格式,即:图像输入:图像输出:控制输入:控制输出。 其中四个参数任意一个可以为空。 控制输入可以是变量、常量、表达式; 控制输出以及图像输入和输出必须是变量。
1.caltab_points:从标定板中读取marks中心坐标,该坐标值是标定板坐标系统里的坐标值,该坐标系统以标定板为参照,向右为X正,下为Y正,垂直标定板向下为Z正。该算子控制输出为标定板中心3D坐标。 2.create_calib_data:创建Halcon标定数据模型。输出一个输出数据模型句柄。 3.set_calib_data_cam_param:设定相机标定数据模型中设置相机参数的原始值和类型。设置索引,类型,以及相机的原始内参数等。 4.set_calib_data_calib_object:在标定模型中设定标定对象。设定标定对象句柄索引,标定板坐标点储存地址。 5.find_caltab:分割出图像中的标准标定板区域。输出为标准的标定区域,控制 6.find_marks_and_pose:抽取标定点并计算相机的内参数。输出MARKS坐标数组,以及估算的相机外参数。 即标定板在相机坐标系中的位姿,由3个平移量和3个旋转量构成。 7.set_calib_data_observ_points( : : CalibDataID, CameraIdx, CalibObjIdx,CalibObjPoseIdx, Row, Column, Index, Pose : ) 收集算子6的标定数据,将标定数据储存在标定数据模型中。输入控制分别为标定数据模型句柄,相机索引,标定板索引,位姿索引,行列坐标,位姿。 8.calibrate_cameras( : : CalibDataID : Error) 标定一台或多台相机,依据CalibDataID中的数据。控制输出平均误差。 9.get_calib_data( : : CalibDataID, ItemType, ItemIdx, DataName : DataValue) 获得标定数据。 依靠索引号和数据名称来返回输出的数据值。可查询与模型相关的数据,与相机相关的数据(包括相机的内外参数等),与标定对象相关的数据,与标定对象的姿态相关的数据。控制输出是要查询的标定数据。 如: get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam) //查询相机的位姿 get_calib_data (CalibDataID, 'calib_obj_pose', [0, NumImage], 'pose', Pose) //查询标定板位姿 10.write_cam_par( : : CameraParam, CamParFile : ) 记录相机的内参数,输入控制为内参数,输出控制为 存取相机内参数的文件名。 11.set_origin_pose( : : PoseIn, DX, DY, DZ : PoseNewOrigin) 设置新的坐标原点,控制输入为原始的位姿和沿着世界坐标系的三个坐标轴的平移量,控制输出为新的位姿
转载自:http://blog.csdn.net/douglax/article/details/38669941 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |