工控编程吧
标题:
上位机视觉HALCON 文件FILE相关函数详解
[打印本页]
作者:
qq263946146
时间:
2017-6-12 15:01
标题:
上位机视觉HALCON 文件FILE相关函数详解
(, 下载次数: 6)
上传
点击文件名下载附件
上位机视觉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 1
read_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)
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4