QQ登录

只需一步,快速开始

工业视觉halcon optimize_fft_speed函数介绍

[ 复制链接 ]
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 的快速傅立叶变换。由于文献中存在几种正向和反向转换的定义,因此此运算符允许用户选择最方便的定义。
傅立叶变换的一般定义如下:
2019-06-11_185348.jpg
对于指数中的符号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

  

halcon从自学到接项目视频教程,另外再赠送全网最全资源  

  

欢迎围观我录制的一套halcon自学视频教程(进入)







回复

使用道具 举报

快速回复 返回列表 客服中心 搜索