| 0.write_fft_optimization_data( : : FileName : ) write_fft_optimization_data将使用optimize_fft_speed确定的用于优化FFT运行时的数据存储在FileName给出的文件中。
 可以使用read_fft_optimization_data加载数据。
 
 
 1.read_fft_optimization_data( : : FileName : )
 read_fft_optimization_data从FileName 给出的文件中加载数据来优化FFT的运行时。
 优化数据必须事先使用optimize_fft_speed确定,并且必须使用write_fft_optimization_data存储。
 如果已为应用程序中使用的图像大小确定了存储的数据,则无需调用optimize_fft_speed。
 应该注意的是,数据应该只在使用optimize_fft_speed确定数据的同一台机器上使用。
 如果没有注意到这一点,那么运行时将不是最优的。
 此外,应该注意的是,使用标准HALCON创建的优化数据不能与 Parallel HALCON一起使用,反之亦然。
 
 
 
 read_fft_optimization_data影响以下使用FFT的操作符的运行时间: fft_generic、fft_image、fft_image_inv、sfs_pentland、sfs_mod_lr、sfs_orig_lr。2.serialize_fft_optimization_data( : : : SerializedItemHandle) serialize_fft_optimization_data序列化用于优化用optimize_fft_speed确定的FFT运行时的数据
 (有关序列化的基本原理,请参阅fwrite_serialized_item)。
 write_fft_optimization_data在文件中写入的数据被转换为序列化项。
 序列化的数据由句柄SerializedItemHandle返回,可以通过deserialize_fft_optimization_data反序列化。
 
 
 3.deserialize_fft_optimization_data( : : SerializedItemHandle : )
 反序列化由serialize_fft_optimization_data序列化的数据,用于优化FFT的运行时(有关序列化的基本原理,请参阅fwrite_serialized_item)。
 序列化数据由句柄SerializedItemHandle定义。
 优化数据必须事先使用optimize_fft_speed确定,并且必须使用serialize_fft_optimization_data序列化。
 如果已为应用程序中使用的图像大小确定了序列化数据,则无需调用optimize_fft_speed。
 注意,数据应该只在使用optimize_fft_speed确定数据的同一台机器上使用。否则,运行时将不是最优的。
 还要注意,使用标准HALCON创建的优化数据不能与Parallel HALCON 一起使用,反之亦然。
 
 deserialize_fft_optimization_data影响以下使用FFT的操作符的运行时间:
 fft_generic、fft_image、fft_image_inv、sfs_pentland、sfs_mod_lr、sfs_orig_lr。
 
 
 4.optimize_fft_speed( : : Width, Height, Mode : )
 optimize_fft_speed确定了一种方法,该方法可以为大小为Width*Height的图像实现FFT的最佳运行时间。
 为一个图像大小确定的数据不影响用于其他图像大小的方法。
 因此,可以使用Width, Height的不同值多次调用optimize_fft_speed,从而为应用程序中使用的所有图像大小获得最佳运行时间。
 参数Mode 决定了搜索最快速方法的彻底性。
 
 
 对于模式='Standard',使用快速搜索,通常需要几秒钟。
 因此,该方法确定的运行时间非常好,并不总是最佳的。
 对于模式='patient',将执行更彻底的搜索,这通常需要几秒钟,在大多数情况下会得到最佳运行时间。
 对于模式='exhaustive',将执行详尽搜索,通常需要几分钟时间,并且始终会得到最佳运行时间。
 在大多数应用程序中,Mode = 'standard'会得到 FFT运行时和搜索最佳运行时所需的时间之间的最佳折衷。
 使用optimize_fft_speed确定的数据可以用write_fft_optimization_data保存,也可以用read_fft_optimization_data加载。
 
 
 请注意,此优化是针对调用操作符的特定计算机执行的。结果不适合在其他计算机上传输和使用,除非它们具有相同的硬件和软件配置(包括驱动程序版本)。
 optimize_fft_speed影响以下使用FFT的操作符的运行时:
 fft_generic、fft_image、fft_image_inv、photometric_stereo、sfs_pentland、sfs_mod_lr、sfs_orig_lr。
 
 
 5.fft_generic(Image : ImageFFT : Direction, Exponent, Norm, Mode, ResultType : )
 FFT-Generic计算输入图像Image 的快速傅立叶变换。由于文献中存在几种正向和反向转换的定义,因此此运算符允许用户选择最方便的定义。
 傅立叶变换的一般定义如下:
 
   对于指数中的符号s应该设置为1还是-1来进行正向变换,人们的意见不一,如到频域的变换。
 对于归一化因子c的大小也存在分歧。
 对于正向变换,这个系数有时设为1,有时设为M*N,有时设为NM开根号(对于么正群FFT)。
 特别是在图像处理应用中,DC项被移到图像的中心。
 
 
 fft_generic允许单独选择这些选项。
 参数Direction允许选择FFT的逻辑方向。
 (这个参数是有需要的;如果DC项位于图像的中心,则需要识别如何移动图像)。
 可能的值是'to_freq'和'from_freq'。
 参数Exponent用于确定指数的符号。它可以设置为1或-1。
 正常化因子可以用Norm设置,可以取“none”、“sqrt”和“n”值。
 参数Mode决定了FFT DC项的位置
 它可以设置为'dc_center'或'dc_edge'。
 
 
 在任何情况下,用户必须确保参数的一致使用。
 这意味着用于正向和反向转换的归一化因子在相乘时必须产生M*N,指数必须是相反的符号,而且两种转换的模式必须是相等的。
 
 
 一个一致的组合是,例如,对于正向转换,“to_freq,-1,n,dc_edge”,
 对于反向转换,from_freq,1,none,dc_edge。
 在这种情况下,FFT可以解释为三角基函数的插值。
 另一种可能的组合是“(to_freq,-1,sqrt,dc_center)”和“(from_freq,1,sqrt,dc_center)”。
 
 
 参数ResultType可用于指定反向转换的结果图像类型(Direction = 'from_freq')。在正向转换(Direction = 'to_freq')中,
 ResultType必须设置为'complex'。
 
 
 上面6个函数的例程为:
 *例程展示如何使用optimize_fft_speed来提高FFT操作符的运行时间。
 dev_update_pc ('off')
 dev_update_window ('off')
 dev_update_var ('off')
 *使用FFT算法常用的512x512大小的图像, 通常可以看到下面使用不同优化模式的显著差异。
 read_image (Image, 'fabrik')
 get_image_size (Image, Width, Height)
 dev_close_window ()
 dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
 dev_display (Image)
 *为了使速度比较有意义,我们将图像转换为复杂的图像。这节省了执行转换的开销
 convert_image_type (Image, ImageComplex, 'complex')
 Iter := 20
 * 首先,我们将在不执行任何优化的情况下测量速度。
 count_seconds (S1)
 for J := 1 to Iter by 1
 fft_generic (ImageComplex, ImageFFT, 'to_freq', -1, 'none', 'dc_edge', 'complex')
 endfor
 count_seconds (S2)
 TimeNoOpt := (S2 - S1) / Iter
 stop ()
 *接下来,我们将执行标准优化。优化通常只需要几秒钟。
 optimize_fft_speed (Width, Height, 'standard')
 count_seconds (S1)
 for J := 1 to Iter by 1
 fft_generic (ImageComplex, ImageFFT, 'to_freq', -1, 'none', 'dc_edge', 'complex')
 endfor
 count_seconds (S2)
 TimeStandard := (S2 - S1) / Iter
 stop ()
 *FFT速度优化数据的存储加载操作,保存此程序后,存储目录为此程序同级目录
 write_fft_optimization_data ('fft_opt.dat')
 read_fft_optimization_data ('fft_opt.dat')
 serialize_fft_optimization_data (SerializedItemHandle)
 open_file ('standard', 'output_binary', FileHandle)
 fwrite_serialized_item (FileHandle, SerializedItemHandle)
 close_file (FileHandle)
 clear_serialized_item (SerializedItemHandle)
 open_file ('standard', 'input_binary', FileHandle)
 fread_serialized_item (FileHandle, SerializedItemHandle)
 deserialize_fft_optimization_data (SerializedItemHandle)
 close_file (FileHandle)
 clear_serialized_item (SerializedItemHandle)
 *
 count_seconds (S1)
 for J := 1 to Iter by 1
 fft_generic (ImageComplex, ImageFFT, 'to_freq', -1, 'none', 'dc_edge', 'complex')
 endfor
 count_seconds (S2)
 TimeStandard := (S2 - S1) / Iter
 
 
 
 
 
 
 
 
 |