上位机视觉HALCON 文件FILE相关函数详解
上位机视觉HALCON 文件FILE相关函数详解 一. read_image( : Image : FileName : ) 在后台读取指定一个或多个图像文件 HALCON图像对象格式(hobj)中,多幅图像保存在此文件里作为一个图像数组返回。如果区域或xlds都包含在文件中,就抛出一个异常。查看write_object函数了解更多信息。 用函数write_image保存的所有图像文件的操作(格式“IMA”)都有扩展名“IMA”。一个描述文件可以包含在IMA格式的图像里(相同的文件名和扩展名'.exp')。 像素数据的类型('byte '、' INT4 ','real')也可以从描述文件获取。 如果描述文件不存在,“byte”作为默认类型使用,以及默认的数据大小为'height * width),(通过get_system获取)。如果“IMA”文件的数据大小与默认数据大小不相等,则会引发异常。 除 HALCON 格式, TIFF, GIF, BMP, JPEG, JPEG-2000, JPEG-XR, PNG, PCX,SUN-Raster, PGM, PPM, PBM, 和 XWD 格式文件都可以读取; PBM的图像灰度值设置的范围为0和255。 文件格式即可通过扩展名识别(如果有的话),也可通过文件的内部结构识别。 如果显示扩展,则可以更快地找到图像。 如果没有扩展名,带扩展名的文件优先于没有扩展名的文件。 如果是PGM,PPM,和PBM文件,相应的扩展(例如,“PGM”)或总值“PNM”可以被使用。 如果是TIFF格式,TIFF和TIF文件也可识别。 如果是“JXR JPEG-XR '格式,' WDP ','wdp'和' HDP格式也可识别。 如果是JPEG-2000格式,仅 JP2文件可识别。 如果是色图像,三个颜色通道的图像被创建,红色通道存储在第一个,蓝色通道第二个和绿色通道第三个。 对于图像格式TIFF、PNG、JPEG-XR,和JPEG-2000,二进制alpha通道被解释为域。 对于TIFF文件,额外带有PhotometricInterpretation= TransparencyMask值的二进制SubIFDs被解释为域。否则,生成的图像对象的域(=矩阵的所有像素)被选择为最大。 对于TIFF图像,多页TIFF文件是以图像对象的数组格式返回。 对于'int8”格式的图像只能在64位系统中读取。而且,只有IMA和TIFF格式支持这种图像类型。 图像文件在当前工作目录和Halcon图像目录中搜索(由环境变量决定)。HALCON图像目录预设在'.'和' /usr/local/ HALCON/images类似UNIX系统的环境中。 可以通过函数set_system设置。可以显示多个图像目录。 这是通过将单个目录分隔为冒号来完成的。 此外,搜索路径可以通过设置环境变量halconimages(与image_dir 结构相同)实现。 例如: setenv HALCONIMAGES "/usr/images:/usr/local/halcon/images"HALCON也搜索子目录 “images” 中图片(为程序实例图片)。环境变量halconroot用于HALCON目录。二. write_image(Image : : Format, FillColor, FileName : )以图像格式保存图片如果域(区域)不能以指定的格式(为“BMP”、“JPEG”,和“ima”)保存,区域外的所有像素的颜色定义为FillColor。对于灰度值图像,必须传递0(黑色)和255(白色)之间的值。RGB彩色图像的RGB值可以作为一个十六进制值直接传递:例如,0xffff00为黄色背景(红色= 255 = 255,绿色,蓝色= 0)。当前支持下面格式:'tiff', 'bigtiff': TIFF format, file extension *.tif 例程: read_image(image,'fabrik') write_image(image,'jpeg',0,'JPG.JPG') 三. serialize_image(Image : : : SerializedItemHandle) serialize_image串行化图像对象(查看fwrite_serialized_item了解串行化基本原理)。 图像对象是由参数Image 定义的。串行化后的图像对象由SerializedItemHandle返回,可用deserialize_image进行反串行化。 四. deserialize_image( : Image : SerializedItemHandle : ) deserialize_image进行反串行化一个由serialize_image串行化的图像对象,(查看fwrite_serialized_item了解串行化基本原理)。 串行化的图像对象由参数SerializedItemHandle定义。反序列化的图像存储在Image 参数中。 五. read_sequence( : Image : HeaderSize, SourceWidth, SourceHeight, StartRow, StartColumn, DestWidth, DestHeight, PixelType,BitOrder, ByteOrder, Pad, Index, FileName : ) 从文件读取无格式的图像数据,并返回一个“合适”的图像。图像数据必须连续逐像素逐行地填充。 任何文件头(长度为headersize字节)被跳过。 参数sourcewidth和sourceheight表明填充图像的大小。 destwidth和destheight显示图像的尺寸。 在最简单的情况下,这些参数是相同的。 图像的部分区域也可以被读取。 所需的图像区域的左上角可以通过startrow和startcolumn确定; 像素类型'bit', 'byte', 'short'(16位无符号),“signed_short”(16位有符号),'long' (32位有符号,“swapped_long'(32位换段),和'real' (32位浮点数)可以被支持。 此外,read_sequence可提取RBG图像通道,如果一个三字节(排序“red”, “green”, “blue”)保存在图像文件中。 对于红色分量的像素型r_byte”必须选择,然后分别是绿色和蓝色分量g_byte '或' b_byte。 msbfirst”(最高有效位在前)或反演方法('lsbfirst”)可以选择用于字节序(bitorder)。 字节序(ByteOrder)msbfirst”(最高有效字节开始)或“lsbfirst,分别进行模拟处理。最后,可以在行的结尾设置一个“对齐”(PAD): 'byte', 'short' or 'long'. 如果整个图像序列存储在文件中,则可以通过参数 Index选择一个图像(索引1开始) 图像文件在当前目录(由环境变量决定)和HALCON图像目录中搜索。HALCON图像目目录预设在'.'和' /usr/local/ HALCON/images类似UNIX系统的环境中 以上几个函数例程: dev_close_window() read_image(image,'fabrik') serialize_image(image, SerializedItemHandle) open_file('standard.txt','output_binary',FileHandle) fwrite_serialized_item(FileHandle,SerializedItemHandle) close_file(FileHandle) *读取 dev_open_window(0,0,512, 512, 'black', WindowHandle) disp_continue_message(WindowHandle,'black','true') stop() dev_clear_window() open_file('standard.txt','input_binary',FileHandle) fread_serialized_item(FileHandle,SerializedItemHandle1) dev_clear_obj(image) deserialize_image(Image,SerializedItemHandle1) dev_display(Image) 六. copy_file( : : SourceFile, DestinationFile : ) copy_file拷贝源文件SourceFile到目标文件DestinationFile , 文件被静默地覆盖。对源文件的文件属性保存。 例如: open_file('hi.txt','output',FileHandle) fwrite_string(FileHandle, 'hallo') close_file(FileHandle) copy_file ('hi.txt', '456.txt') 七. delete_file( : : FileName : ) 删除 FileName 指定的文件 八. file_exists( : : FileName : FileExists) 判断文件FileName 是否存在,存在FileExists置为true,不存在则相反 例程: open_file('hi.txt','output',FileHandle) fwrite_string(FileHandle, 'hallo') close_file(FileHandle) copy_file('hi.txt', '456.txt') file_exists('hi.txt', FileExists) if(FileExists) delete_file ('hi.txt') endif 九. get_current_dir( : : : DirName) 获取当前工作目录 十. list_files( : : Directory, Options : Files) 获取指定目录内全部文件 list_files函数返回由参数Directory 指定的文件目录下的所有文件,保存在Files。可以用 ''或 ' 指定当前目录。参数Options 可以通过传递一个数组来指定不同的处理选项。 如果Options 包含'files' ,则仅返回Directory中的文件。 如果传递了 'directories',则返回Directory 中的目录。 目录以'\'结尾(Windows系统)或' / '结尾(类似于UNIX的系统)。 如果文件以及目录都要返回,[ 'files ','directories ]必须指定。 如果 'files' nor 'directories都没有传递,list_files返回一个空数组。 通过传递'recursive',可以递归检索所有子目录。 在类似Unix系统中,“follow_links '可以用来指定文件或目录的符号链接应被遵循。 默认设置下,符号链接不引用,因此如果他们指向目录,也不搜索,指向文件也不返回。 对于递归搜索,最大搜索深度可以用“max_depth <d>指定,其中<d> '是一个数字,指定最大深度。因此,“2”max_depth指定Directory 和它所有子目录应立即搜索。如果应该遵循符号链接,符号链接导致目录结构搜索循环,则搜索可能不会终止。正因为如此,最多1000000个文件(和目录)返回到Files中。 通过指定一个不同的数的max_files <d> ',这个指定的值可以减少。 例程: get_current_dir(DirName) list_files (DirName, 'files', Files) 十一. make_dir( : : DirName : ) 在DirName 位置创建一个文件夹 例如,在当前工作目录创建一文件夹123: get_current_dir(DirName) DirName:=DirName+'/123' make_dir (DirName) 十二. remove_dir( : : DirName : ) 删除文件夹DirName 十三. set_current_dir( : : DirName : ) 设置当前的工作目录 十四. read_world_file( : : FileName : WorldTransformation) 从ARC/INFO world文件读取geo代码 read_world_file从FileName指定的ARC/INFO world文件中读取geo代码。 返回一个均匀的二维变换矩阵保存到WorldTransformation), 在HALCON的系统变量image_dir包含所有目录里(这通常是环境变量halconimages内容)进行搜索(见read_image)。 这个变换矩阵在用 write_contour_xld_arc_info写之前,可以用于将 XLD轮廓转换到世界坐标系统。 如果矩阵 WorldTransformation通过调用hom_mat2d_invert被倒置, 产生的矩阵可以将事先由read_contour_xld_arc_info读取的轮廓,转换到图像坐标系中。 十五.write_object(Object : : FileName : ) 保存图像对象到文件中; 图像对象是(可能是混合的)图像,区域,或xlds数组。如果没有指定文件名的扩展,扩展的。hobj”将追加。图像数据以HALCON的图像对象格式保存。格式描述如下。 HALCON 图像对象 (HOBJ) (HALCON 12.0 或更高版本): hobj是一个二进制文件格式, 它提供的功能是读写各种HALCON的对象(图像,区域,和xlds)。 由于数据既没有压缩也没有转换,所以在大多数情况下,编写这种文件格式比其他支持的文件格式要快。 因此,如果应用程序需要尽可能快的读写各种HALCON的图像对象,也不需要无压缩时,建议使用这种格式。 这种文件格式的默认文件扩展名是“hobj”。 对于图片,所有HALCON像素类型可以写。支持多通道图片。 通道可以有混合像素类型,但必须具有相同的宽度和高度。 图片的域和它的创建日期也存储在文件中。 对象数组被写入单个文件中。 例程: dev_close_window() read_image(image,'fabrik') threshold (image, regions, 162, 255) write_object (regions,'123.hobj' ) dev_clear_obj(regions) * dev_open_window(0, 0, 512, 512, 'black', WindowHandle) read_object (Object,'123.hobj' ) count_obj(Object,num) connection(Object,co) count_obj(co,num1) dev_set_colored(3) select_shape(co,SelectedRegions, 'area', 'and', 6000, 99999) dev_clear_window() dev_display(SelectedRegions) 十六. serialize_object(Object : : : SerializedItemHandle) 串行化图像对象 (串行化的基本原理介绍参考fwrite_serialized_item)。 图像对象是一组 图像对象、域对象,或XLD对象,并通过参数Object定义。 串行化的图像对象保存到参数SerializedItemHandle; 可以通过函数deserialize_object反串行化后得到数据。 十七. deserialize_object( : Object : SerializedItemHandle : ) 反串行化图像对象 例程: read_image(image,'fabrik') threshold (image, Regions, 169, 255) connection(Regions,ConnectedRegions) serialize_object (ConnectedRegions, SerializedItemHandle) ************* open_file('gkbc8.com','output_binary',FileHandle) fwrite_serialized_item(FileHandle,SerializedItemHandle) close_file(FileHandle) deserialize_object (Object, SerializedItemHandle) 十八. open_file( : : FileName, FileType : FileHandle) 以ASCII或二进制格式打开文件 文件的名称由参数 FileName.指定。 返回文件句柄保存在 FileHandle。 参数FileType决定了该类型的文件。 文件类型有 FileType Result-------------------------------------------------------------------------------------'input' 一个已经存在的输入文件,以ASCII格式打开用以读'output' 新的输出文件打开,以ASCII格式写 'append' 打开已存在的文件,以ASCII格式,在文件尾部写数据 'input_binary' 一个已经存在的输入文件,以二进制格式打开用以读 'output_binary' 新的输出文件打开,以二进制格式写 'append_binary' 打开已存在的文件,以二进制格式,在文件尾部写十九. close_file( : : FileHandle : )关闭一个文本文件,文件事先由函数open_file打开 二十:fnew_line( : : FileHandle : ) 创建新的一行 输出文件必须以ASCII格式打开。同时,输出缓冲区被清除。 二十一. fread_char( : : FileHandle : Char) 从文件中读取一字符 二十二. fread_line( : : FileHandle : OutLine, IsEOF) 读取当前输入文件FileHandle中的一行(包括换行符)。 输入文件必须以ASCII格式打开。 读取行保存在参数OutLine。 如果到达文件末尾,IsEOF返回值1,否则为0。 二十三. fread_string( : : FileHandle : OutString, IsEOF) 从当前文件FileHandle读取字符串。 输入文件必须以ASCII格式打开。 一个字符串以第一个可被描述的字符开始:字母,数字,扩展字符串(除空白)。 当一个空格或换行读取到时,字符串结束。 几个连续的行跳过被忽略。 读取的字符串保存在outstring。 如果到达文件末尾,IsEOF返回值1,否则为0。 二十四. fwrite_string( : : FileHandle, String : ) 将字符串String写入到文件FileHandle中。 输出文件必须由函数open_file 以ASCII格式打开。 代码set_system(::'flush_file',<boolean-value>的调用,决定是否直接输出数据到磁盘。 如果值的flush_file”设置为“false”,字符串(特别是屏幕输出)仅在调用 fnew_line后,才显示。 字符串和整数和浮点数可以用作参数。如果一个以上的值作为输入,那么这些值将不间断地连续输出。 例程: open_file('gkbc8.txt','output', FileHandle) fwrite_string (FileHandle, 'hallo\r\n') fwrite_string (FileHandle, 'gkbc8.com\r\n') close_file (FileHandle) open_file ('gkbc8.txt', 'input', FileHandleIn) open_file ('gkbc7.txt', 'output', FileHandleOut) fread_string (FileHandleIn, Number, IsEOF) fwrite_string(FileHandleOut,Number) fnew_line (FileHandleOut) Char := '' Index := 0 while (Char != 'eof') fread_char(FileHandleIn, Char) if ((Char != 'eof')and (Char != 'nl')) fwrite_string(FileHandleOut, Char) endif if (Char == 'nl') fnew_line(FileHandleOut) Index := Index + 1 endif endwhile close_file (FileHandleIn) close_file (FileHandleOut) 二十五. write_tuple( : : Tuple, FileName : ) write_tuple保存数组的内容到文件。 数据是用ASCII格式编写的。 因此,可以在不同的文档结构之间交换该文件。 HALCON中数组的默认文件扩展名是‘'tup'; 二十六. read_tuple( : : FileName : Tuple) 从文件中读取数组类型数据 二十七. serialize_tuple( : : Tuple : SerializedItemHandle) 串行化数组数据 二十八. deserialize_tuple( : : SerializedItemHandle : Tuple) 反串行化数据 例程: a:=123 write_tuple (a, '123.tup') read_tuple ('123.tup', Tuple) open_file('123.txt','output_binary', FileHandle) serialize_tuple (Tuple, SerializedItemHandle) fwrite_serialized_item(FileHandle,SerializedItemHandle) close_file(FileHandle) open_file('123.txt','input_binary', FileHandle) fread_serialized_item(FileHandle, SerializedItemHandle1) deserialize_tuple (SerializedItemHandle1, Tuple1) close_file(FileHandle) 二十九. serialize_xld(XLD : : : SerializedItemHandle) 串行化XLD对象 三十. deserialize_xld( : XLD : SerializedItemHandle : ) 反串行化XLD对象 例程: dev_close_window() read_image(image,'fabrik') edges_sub_pix(image,edges,'canny', 1, 20, 40) serialize_xld (edges, SerializedItemHandle) open_file('123.txt','output_binary',filehandle) fwrite_serialized_item(filehandle, SerializedItemHandle) close_file(filehandle) open_file('123.txt','input_binary',filehandle) fread_serialized_item(filehandle,SerializedItemHandle1) deserialize_xld (XLD,SerializedItemHandle1 ) dev_open_window(0, 0, 512, 512, 'black', WindowHandle) dev_display(XLD) 三十一. write_contour_xld_arc_info(Contours : : FileName : ) 以ARC/INFO生成的格式,将XLD轮廓存到文件FileName ; 如果没指定绝对路径,输出文件在当前目录下创建。 轮廓必须事先用函数affine_trans_contour_xld转换到世界坐标系。 所需要的转换信息,可以通过 read_world_file.从 ARC/INFO文件读取 三十二. read_contour_xld_arc_info( : Contours : FileName : ) 从ARC/INFO 文件中读取XLD轮廓 例程: dev_close_window() read_image(image,'fabrik') edges_sub_pix(image,edges,'canny', 1, 20, 40) dev_open_window(0, 0, 512, 512, 'black', WindowHandle) hom_mat2d_identity (HomMat2DIdentity) hom_mat2d_translate (HomMat2DIdentity, 100, 100,HomMat2DTranslate) affine_trans_contour_xld (edges, ModelAffinTrans,HomMat2DTranslate) write_contour_xld_arc_info (ModelAffinTrans, '123.gen') read_contour_xld_arc_info (Contours, '123.gen') dev_clear_window() dev_display(Contours) 三十三. write_contour_xld_dxf(Contours : : FileName : ) 将XLD轮廓写入到DXF文件中 几何轮廓,及其他用于定义轮廓的数据都被写入到文件中; write_contour_xld_dxf根据DXF版本ac1009(AutoCAD版本12)进行写入文件操作。 每个轮廓存储为折线。 属性值存储为折线每个顶点的扩展数据。 全局属性值存储为折线扩展数据。 所有的属性名称也存储为折线扩展数据。 函数read_contour_xld_dxf可以结合XLD属性,读取XLD轮廓及其属性。 其他可以读取DXF文件的应用,仅导入轮廓几何信息,忽略了属性信息。 三十四. read_contour_xld_dxf( : Contours : FileName, GenParamNames, GenParamValues : DxfStatus) read_contour_xld_dxf读取DXF文件的内容(ac1009 AutoCAD DXF,版本12)并将其转换为XLD轮廓的轮廓。如果没有在FileName指定绝对路径,在当前工作目录搜索文件。 输出参数dxfstatus包有含轮廓数量。 如果有需要,会提示DXF文件的部分无法解释。 read_contour_xld_dxf支持以下图形实体: · POLYLINE · 由线段组成的2维曲线(或闭合) · LWPOLYLINE · LINE · POINT · CIRCLE · ARC · ELLIPSE · SPLINE · BLOCK · INSERT DXF实体的X和Y坐标存储在,分别对应于XLD轮廓列行坐标上。DXF的实体的Z坐标被忽略。 如果文件由write_contour_xld_dxf创建,用于定义XLD轮廓的所有属性和全局属性,都会被读取。 这意味着,read_contour_xld_dxf支持所有write_contour_xld_dxf保存的扩展数据。这些属性,通过设置函数参数 'read_attributes' 为 'false'.,可以关闭读取 函数参数名称(S)在genparamnames和对应值(S)在GenParamValues。 DXF文件的实体圆、弧、椭圆、样条由XLD轮廓拟合。 拟合的精度可以通过设置参数值min_num_points和max_approx_error”来控制。 参数“min_num_points”定义采样点,用于近似的最小数量。 注意参数的min_num_points总是指圆或椭圆,圆弧或椭圆弧, 如果min_num_points”设置为50,弧类型的DXF实体代表一个半圈,这半圈是由至少25个采样点来拟合。 参数“max_approx_error”定义了与理想的圆形或椭圆形相比,XLD轮廓偏差的最大值,分别为(单位:像素)。 为了提高拟合的准确性,这两个标准都被评估。 然后,使用更精确的拟合。 例程: dev_close_window() read_image(image,'fabrik') edges_sub_pix(image,edges,'canny', 1, 20, 40) dev_open_window(0, 0, 512, 512, 'black', WindowHandle) write_contour_xld_dxf (edges, '123.dxf') read_contour_xld_dxf (Contours1, '123.dxf', [], [],DxfStatus) dev_clear_window() dev_display(Contours1) 三十五. write_polygon_xld_arc_info(Polygons : : FileName : ) 将XLD多边形以ARC/INFO 格式保存到文件 多边形必须事先用affine_trans_polygon_xld转换到世界坐标系。 必要的转变参数,可以用read_world_file从ARC/INFO文件读取 可能参数Polygons中不含有多边形,无法以ARC/INFO格式保存到文件。 read_polygon_xld_arc_info读取时,就读取不到多边形,函数例如split_contours_xld 访问读取的轮廓就会失败; 例程: dev_close_window() read_image(image,'fabrik') edges_sub_pix(image,edges,'canny',1, 20, 40) dev_open_window(0,0, 512, 512, 'black', WindowHandle) gen_polygons_xld(edges,Polygons2,'ramer', 2) write_polygon_xld_arc_info(Polygons2, '123.gen') read_polygon_xld_arc_info(Polygons, '123.gen') dev_clear_window() dev_display(Polygons) 三十六. read_polygon_xld_dxf( : Polygons : FileName, GenParamNames, GenParamValues : DxfStatus) 从DXF文件读取XLD多边形;可参阅read_contour_xld_dxf 三十七. write_polygon_xld_dxf(Polygons : : FileName : ) 将XLD多边形以DXF格式保存到文件 例程: read_image (Image, 'mreut') edges_sub_pix (Image, Edges, 'canny', 2, 20, 40) regress_contours_xld (Edges, RegressContours, 'no', 1) select_obj (RegressContours, ObjectSelected, 1) query_contour_attribs_xld (ObjectSelected, Attribs) query_contour_global_attribs_xld (ObjectSelected, GlobalAttribs) write_contour_xld_dxf (RegressContours, 'contours') read_contour_xld_dxf (ContoursRead, 'contours', [], [],DxfStatusCont) select_obj (ContoursRead, ObjectSelected, 1) query_contour_attribs_xld (ObjectSelected, AttribsTest) query_contour_global_attribs_xld (ObjectSelected,GlobalAttribsTest) gen_polygons_xld (ContoursRead, Polygons, 'ramer', 2) write_polygon_xld_dxf (Polygons, 'polygons') read_polygon_xld_dxf (PolygonsRead, 'polygons', [], [],DxfStatusPoly) 三十八。list_image_files( : : ImageDirectory, Extensions, Options : ImageFiles) 获取指定目录下,指定文件类型的全部文件 list_image_files ('.',[] ,[] , ImageFiles)for Index := 1 to |ImageFiles| by 1read_image (Image,ImageFiles[Index-1])endfor
三十九. parse_filename( : : FileName : BaseName, Extension, Directory) 从参数FileName 解析出文件名,后缀名,路径名。 保存到BaseName, Extension, Directory 例程: FullFileNames:=['C:/images/image_01.png','C:/images/image_02.png','C:/training_image.png']parse_filename (FullFileName, BaseName, Extension, Directory)tuple_regexp_select(BaseName,'training',TrainingImages)
|