Halcon算子知识:optical_flow_mg

发布于:2022-10-14 ⋅ 阅读:(930) ⋅ 点赞:(0)

目录

一、说明

二、关于光流法

三、halcon算子optical_flow_mg说明

3.1 FDRIG 算法基于包含以下假设的能量函数的最小化

3.2 DDRAW 算法基于包含以下假设的能量泛函的最小化

3.3CLG 算法使用了某些假设

四、讨论各个参数的影响。

五、默认参数集对上述参数使用以下值:

六、本文的支持文章


一、说明

        本文是对halcon手册的整理,如果真正掌握光流法,恐怕一个博文是不够的。作者只能先呈现这个博文,再对文中的晦涩理论进行逐步阐述,参考文章将放在文后,期望读者能从中学到全部知识。

二、关于光流法

光流Optical Flow)是一种研究图像对齐的算法,一般包括两大类:稀疏光流稠密光流

稀疏光流就是研究图像中稀疏点的光流,这些点一般是角点

稠密光流则是研究图像中所有点的偏移量

以下介绍halcon的基本光流算子optical_flow_mg的原理方法。该算子计算两个图片的光流法。

三、halcon算子optical_flow_mg说明

optical_flow_mg(ImageT1, ImageT2 : VectorField : Algorithm, SmoothingSigma, IntegrationSigma, FlowSmoothness, GradientConstancy, MGParamName, MGParamValue : )

vector_field //两帧real类型的图像,描述X或者Y方向的运动;连续图形的光学流分布

        optical_flow_mg 计算两个图像之间的光流。光流表示有关单目图像序列的两个连续图像之间移动的信息。图像中的移动可以由在世界中移动的对象或由在获取两个图像之间的相机(或两者)的移动引起。这些 3D 运动在 2D 图像平面中的投影称为光流。

        图像序列的两个连续图像在ImageT1和ImageT2中传递。计算出的光流在 VectorField 中返回。矢量场 VectorField 中的矢量表示 ImageT1 和 ImageT2 之间图像平面中的运动。 ImageT2 中对应于 ImageT1 中点 (r,c) 的点由 (r',c') = (r+u(r,c),c+v(r,c)) 给出,其中 u( r,c) 和 v(r,c) 表示向量场图像 VectorField 在点 (r,c) 的行和列分量的值。

        参数 Algorithm 允许选择三种不同的算法来计算光流。所有这三种算法都是通过使用多重网格求解器来实现的,以确保对底层偏微分方程的有效求解。

  •  对于 Algorithm = 'fdrig',使用 Brox、Bruhn、Papenberg 和 Weickert 提出的方法。这种方法是流动驱动的、稳健的、各向同性的,并使用梯度恒常项。
  • 对于 Algorithm = 'ddraw',使用了 Nagel 和 Enkelmann 提出的方法的稳健变体。这种方法是数据驱动的、稳健的、各向异性的,并使用扭曲(与原始方法相反)。
  • 对于 Algorithm = 'clg',使用了 Bruhn、Weickert、Feddern、Kohlberger 和 Schnörr 提出的局部全局组合方法。

        在所有三种算法中,输入图像首先可以通过标准偏差为 SmoothingSigma 的高斯滤波器进行平滑处理(参见 derivate_gauss)。

        所有三种方法都是变分方法,它们将光流计算为合适能量函数的最小值。一般来说,能量泛函具有以下形式:

                                                E(w)=E_D(w)+\alpha E_S(w)

        其中 w=(u,v,1) 是要确定的光流矢量场(在第三个坐标中的时间步长为 1)。图像序列被视为一个连续函数f(x),其中 x=(r,c,t) 和  (r,c)   表示位置,t 表示时间。此外,E_D(w)表示数据项,而E_S(w) 表示平滑度项,\alpha是决定解的平滑度的正则化参数。正则化参数\alpha在 FlowSmoothness 中传递。虽然数据项编码了关于连续图像中对象特征的恒定性的假设,例如,灰度值的恒定性或灰度值的一阶空间导数的恒定性,但平滑性项编码了关于(分段)平滑度的假设解,即要确定的向量场的平滑度。

3.1 FDRIG 算法基于包含以下假设的能量函数的最小化

        灰度值的恒定性:假设一个图像序列的连续图像中对应的像素具有相同的灰度值,即 f(r+u,c+v,t+1) = f(r,c,t )。这可以使用向量表示法更简洁地写为 f(x+w) = f(x)。

        空间灰度值导数的恒定性:假设图像序列的连续图像中的相应像素另外具有相同的空间灰度值导数,即\bigtriangledown _2 f(x+u,y+w,t+1)= \bigtriangledown _2 f(x,y,t)也成立,其中\bigtriangledown _2 f =(\partial xf,\partial yf)​​​​​​​ 。这可以更紧凑地写为\bigtriangledown _2 f (x+w)=\bigtriangledown _2 f(x) .与灰度值恒常性相比,梯度恒常性具有对加性全局光照变化不变的优点。

        大位移:假设发生大位移,即大于一个像素的位移。在这种假设下,有意识地避免在模型中使用通常在文献中提出的恒常性假设的线性化是有意义的。

        数据项中的统计稳健性:为了减少异常值的影响,即违反恒常性假设的点,它们以统计稳健的方式受到惩罚,即,习惯的非稳健二次惩罚\Psi _D(s^2)=s^2被替换为线性惩罚通过\Psi _D(s^2)=\sqrt{s^2+\varepsilon ^2} ,其中\varepsilon =0.001是一个固定的正则化常数。

 流场 I 中不连续性的保留:假设解是分段平滑的。虽然实际平滑度是通过对流的一阶导数进行惩罚来实现的\left | \bigtriangledown _2 u \right |^2+\left | \bigtriangledown _2 v \right |^2\varepsilon =0.001,但使用统计上稳健的(线性)惩罚函数\Psi _D(s^2)=\sqrt{s^2+\varepsilon ^2}提供了所要确定的流场中运动边缘的所需保留。这种类型的平滑项称为流动驱动和各向同性。

 考虑到以上所有假设,FDRIG 算法的能量泛函可以写为 

 这里,\alpha是 FlowSmoothness 中传递的正则化参数,而 \gamma是GradientConstancy 中传递的是梯度恒定权重。这两个参数构成了 FDRIG 算法的模型参数,下面将更详细地描述。

3.2 DDRAW 算法基于包含以下假设的能量泛函的最小化

灰度值的恒定性:假设图像序列的连续图像中的对应像素具有相同的灰度值,即f(x+w) = f(x)。

大位移:假设发生大位移,即大于一个像素的位移。在这种假设下,有意识地避免在模型中使用通常在文献中提出的恒常性假设的线性化是有意义的。

    数据项中的统计稳健性:为了减少异常值的影响,即违反恒常性假设的点,它们以统计稳健的方式受到惩罚,即,习惯的非稳健二次惩罚\Psi _D(s^2)=s^2被替换为线性惩罚通过\Psi _D(s^2)=\sqrt{s^2+\varepsilon ^2} ,其中\varepsilon =0.001是一个固定的正则化常数。

流场中不连续性的保留 II:假设解是分段平滑的。与 FDRIG 算法允许处处不连续性不同,DDRAW 算法只允许原始图像边缘处的不连续性。在这里,局部平滑度以这样一种方式控制,即流场在图像边缘上是清晰的,而沿图像边缘是平滑的。这种类型的平滑项称为数据驱动和各向异性。DDRAW 算法的所有假设都可以组合成以下能量泛函:

其中P_{NE}( \bigtriangledown _2 f(x)) 是正交于 的归一化投影矩阵\bigtriangledown _2f(x),其中:

 ​​​​​​​

 持有。该矩阵确保仅沿图像边缘假设流场的平滑度。相比之下,没有对跨图像边缘的平滑度进行假设,从而导致跨图像边缘可能出现解中的不连续性这一事实。在这方面,用作防止投影矩阵变得奇异的正则化参数。与 FDRIG 算法相比,DDRAW 算法只有一个模型参数:正则化参数 。如上所述,下面更详细地描述。

3.3CLG 算法使用了某些假设

灰度值的恒常性:假设图像序列的连续图像中对应像素具有相同的灰度值,即f(x+w) = f(x)。

小位移:与上述两种方法相比,CLG假设只有小位移才会发生,即位移按几个像素的顺序排列。这有利于模型中恒常性假设的线性化,并导致近似,即应该成立。表示空间和时间域的梯度。

解的局部恒常性:此外,假定要计算的流场是局部恒常的。这有助于将数据项中的图像数据集成到每个像素的相应邻域上。这进而提高了算法对噪声的鲁棒性。从数学上讲,这可以通过重新制定二次数据项来实现。

通过对指定的邻域进行局部高斯加权积分,得到以下数据项:。式中,为3x3矩阵与高斯滤波器的卷积,其标准差为ρ(见derivate_gauss)。

流场的一般光滑性:最后,假设解在图像中处处光滑。这种特殊类型的平滑项称为齐次的。

上述所有假设可以合并为以下能量泛函:

对应的模型参数是正则化参数α和积分尺度ρ(IntegrationSigma),它决定了要对数据项进行积分的邻域的大小。下面将更详细地描述这两个参数。

要用FDRIG、DDRAW或CLG算法计算图像序列中连续两幅图像的光流向量场,必须确定最能满足各自算法假设的解。从数学的角度来看,这意味着应该执行上述能量泛函的最小化。对于FDRIG和DDRAW算法来说,所谓的“粗到细”的扭曲策略在这种最小化中扮演着重要的角色,因为它们能够计算大位移。因此,这两种方法在数值上都能较好地解决恒常性假设线性化的不足。

为了计算大位移,“粗到细”的扭曲策略使用了两个紧密相连的概念:问题的连续细化(粗到细)和通过已计算的位移对当前图像对的连续补偿(扭曲)。算法上,这种由“粗到细”的扭曲策略可以描述为:

1. 首先,将当前图像对的两个图像都缩小到非常粗的分辨率级别;

2. 然后,在此粗分辨率基础上计算光流向量场;

3. 向量场是下一分辨率层所需要的:它应用于图像序列的第二幅图像,即在较细分辨率水平上的问题是由已计算的光流向量场补偿。这一步也被称为扭曲;

4. 修改后的问题(差分问题)现在在较细的分辨率级别上得到解决,即计算了光流向量场;

5. 重复上述步骤3~4,直到达到最佳分辨率;

6. 最后的结果是通过将所有分辨率级别的向量场相加来计算的。

这个增量计算光流向量场具有以下优势:虽然由粗到细的策略确保在最细分辨率水平上的位移非常小,翘曲策略保证了增量位移保持较小的位移(光流向量场的区别问题)。由于小位移的计算要比大位移精确得多,因此使用这种由粗到细的扭曲策略,结果的精度通常会显著提高。

然而,现在必须解决这些问题的整个层次结构,而不是单个的对应问题。对于CLG算法,这种由粗到细的扭曲策略是不必要的,因为模型已经假定了较小的位移。

可以为FDRIG和DDRAW算法指定最大分辨率级别(扭曲级别)、两个连续分辨率级别之间的分辨率比以及最佳分辨率级别。详情如下。

泛函的极小化是非常密切相关的数学函数的最小化:事实上一阶导数的零交叉是函数最小化的必要条件,是实现所谓的欧拉方程的最小化函数功能的必要条件(在这种情况下最小化函数对应于所需的光流向量场)。欧拉-拉格朗日方程是偏微分方程。通过对这些欧拉-拉格朗日方程进行有限差分离散化,得到了大稀疏非线性方程组的FDRIG和DDRAW算法结果。由于采用了由粗到细的扭曲策略,因此必须针对每个分辨率级别求解这样一个方程组,即每一个扭曲水平。对于CLG算法,必须求解一个稀疏线性方程组。

为了保证上述非线性方程组的有效求解,FDRIG和DDRAW采用双向多重网格方法。从数值的角度来看,这些策略是求解大型线性和非线性方程组的最快方法之一。与传统的非层次迭代方法相比,如不同的线性和非线性Gauss-Seidel变分,多重网格方法的优点是可以在较粗的分辨率水平上有效地确定解的修正。这进而导致了显著的更快的收敛。多网格方法的基本思想还包括分层计算这些修正步骤,即在较粗分辨率级别上计算误差本身使用相同的策略,并能通过更粗的分辨率水平修正步骤上的误差有效地计算其误差(即误差的误差)。根据每个周期执行一个或两个纠错步骤,可以得到所谓的V或W周期。对于2至4个分辨率级别,通过分辨率层次结构的相应策略如下:

这里,原始问题的迭代用大标记表示,小标记表示纠错问题的迭代。

算法上,修正周期可以描述为:

1. 在第一步中,使用交互式线性或非线性基本求解器(例如,Gauss-Seidel求解器的一个变体)执行几个(少数)迭代。这个步骤叫做预松弛步骤;

2. 在第二步中,计算当前误差来修正当前解(第一步后的解)。为了提高效率,计算误差的分辨率较粗。此步骤可迭代执行多次,称为粗网格校正步骤;

3. 在最后一个步骤中,再次使用第1步的交互式线性或非线性基本求解器进行几次迭代。这个步骤叫做后松弛步骤。

此外,可以以分层的方式初始化解决方案。从原始(非线性)方程系统的一个非常粗糙的变体开始,解被不断地细化。为了做到这一点,将方程系统中较粗变量的插值解作为下一个较细变量的初始化。在每个分辨率级别上,上面描述的V或W循环用于在该分辨率级别上有效地求解(非线性)方程组。相应的多重网格方法在文献中称为全多重网格方法。完整的多重网格算法可以可视化如下:

这个例子代表了一个完整的多重网格算法,它使用了分层初始化的每个分辨率级别上的两个W校正周期。从一个分辨率级到下一个分辨率级的插值步骤用i和两个W的校正周期W1、W2表示。原始问题的迭代用大标记表示,小标记表示纠错问题的迭代。

在FDRIG、DDRAW和CLG算法的多网格实现中,可以设置以下参数:是否执行分层初始化;粗网格校正步数;校正水平的最大次数(分辨率水平);预松弛步骤数;后松弛步骤数。下面将更详细地描述这些参数。

FDRIG算法的基本求解器是线性Gauss-Seidel算法的点耦合定点变体。DDRAW算法的基本求解器是同一类型的交替线耦合定点变量。可以使用进一步的参数为这两种算法指定定点步骤的数量。CLG算法的基本求解器是点耦合线性Gauss-Seidel算法。在不同分辨率水平之间的数据传输分别采用基于区域的插值和基于区域的平均方法。

四、讨论各个参数的影响。

  输入图像及其域(感兴趣区域)传递到ImageT1和ImageT2。在ImageT1和ImageT2区域交集的最小外接矩形上计算光流向量场VectorField。VectorField的域是这两个域的交集。因此,通过指定ImageT1和ImageT2的简化域,可以专注处理,并可能节约运行时。但是,需要注意的是,所有方法都计算光流的全局解。特别是,可以得出结论,在简约域上的解决方案不必(也不可能)与在全域上的解决方案相同(全域上的解决方案仅限于简约域)。

SmoothingSigma指定用于平滑两个输入图像的Gaussian核的标准差。SmoothingSigma越大,Gaussian核的低通(low-pass)效应越大,即预处理后的图像越平滑。通常,SmoothingSigma = 0.8是一个合适的选择。然而,区间[0,2]中的其他值也是可能的。只有在输入图像噪声较大时才应考虑较大的标准差。应该注意的是,SmoothingSigma值越大,执行时间越长。

IntegrationSigma指定用于对数据项的邻域信息进行局部积分的Gaussian核Gρ的标准差ρ。该参数仅在CLG算法中使用,对其他两种算法没有影响。通常,IntegrationSigma = 1.0是一个合适的选择。然而,区间[0,3]中的其他值也是可能的。只有在输入图像噪声较大时才应考虑较大的标准差。应该注意的是,较大的IntegrationSigmalead值会使执行时间稍微长一些。

flow smooth指定平滑项相对于数据项的权重α。FlowSmoothness越大,计算得到的光流场越光滑。需要注意的是,选择过小的FlowSmoothness可能会导致不可用的结果,即使使用了统计上健壮的惩罚函数,特别是当扭曲策略需要预测太多图像之外的信息时。对于灰度值范围为[0 255]的字节图像,流驱动的FDRIG算法的FlowSmoothness在20左右,数据驱动的DDRAW算法和齐次CLG算法的FlowSmoothness在1000左右,通常会得到很好的结果。

GradientConstancy指定梯度恒常性相对于灰度值恒常性的权重γ。这个参数只在FDRIG算法中使用。对于另外两种算法,它不影响结果。对于灰度值范围为[0,255]的字节图像,GradientConstancy = 5通常是一个不错的选择,因为这两个恒常性假设在同一程度上使用。然而,对于光照变化较大的情况,可能需要显著增大的GradientConstancy值才能获得较好结果。需要注意的是,对于梯度恒常性权值较大的情况,还必须选择更大的平滑度参数FlowSmoothness。

多网格求解器的参数以及由粗到细的扭曲策略可以用通用参数MGParamName和MGParamValue来指定。通常,通过MGParamName = 'default_parameters'和MGParamValue = 'very_accurate'、'accurate'、'fast_accurate'或'fast',使用四个默认参数集中的一个就足够了。下面将描述缺省参数集。如果应该单独指定参数,则必须将MGParamName和MGParamValue设置为相同长度的元组。与MGParamName中指定的参数对应的值必须在MGParamValue中对应的位置指定。

MGParamName = 'warp_zoom_factor'可用于指定粗到细的扭曲层次结构中两个连续扭曲级别之间的分辨率比率。必须从开区间(0,1)中选择'warp_zoom_factor'。出于性能原因,'warp_zoom_factor'通常设置为0.5,即对于每个较粗的扭曲级别,每个方向上的像素数减半。对于不使用扭曲的算法,这将导致需要执行的计算增加33%。'warp_zoom_factor'的值接近1时,结果会稍微好一些。但是,它们需要更多的计算时间,例如,对于'warp_zoom_factor' = 0.9,需要426%的计算时间。

MGParamName = 'warp_levels'可用于将扭曲层次结构限制为最大的层次数量。对于'warp_levels' = 0,使用尽可能多的级别。如果图像大小不允许使用指定数量的级别(考虑到分辨率'warp_zoom_factor'),则使用尽可能多的级别。通常,'warp_levels'应该设置为0。

MGParamName = 'warp_last_level'可用于指定不再计算流增量的扭曲水平的数量。通常,'warp_last_level'被设置为1或2,即对于每个扭曲水平计算流量增量,或在计算中跳过最细的扭曲水平。由于后一种情况下的计算是在原图像分辨率一半的图像上进行的,因此获得的计算时间可以用来计算更精确的解决方案,例如使用带有附加迭代的完整多重网格算法。然后将更精确的解插值到整个分辨率。

指定由粗到细的扭曲策略的三个参数只在FDRIG和DDRAW算法中使用。它们在CLG算法中被忽略。

MGParamName = 'mg_solver'可用于指定求解(非线性)方程组(在每个扭曲级别)的通用多重网格策略。对于'mg_solver'= 'multigrid',使用普通的multigrid算法(没有粗到细的初始化);而对于'mg_solver'= 'full_multigrid',使用完整的multigrid算法(具有粗到细的初始化)。由于低分辨率0.5用于两个连续级别之间的由粗到细的初始化(与低分辨率扭曲策略相比,这个值是指算法硬编码),使用一个完全的多重网格算法比正常的多重网格算法增加了大约33%的计算时间。使用“mg_solver=full_multigrid”通常会得到比“mg_solver=multigrid”更精确的数值结果。

MGParamName = 'mg_cycle_type'可用于指定每个多网格水平使用V或W校正周期。由于在各自校正周期的两个连续级别之间使用0.5的低分辨率,因此使用W循环而不是V循环会将计算时间增加约50%。使用'mg_cycle_type=w'通常比'mg_cycle_type=v'在数值上得到更准确的结果。

MGParamName = 'mg_levels'可用于限制从粗到细的初始化以及实际的V或W纠正周期的多重网格层次结构。对于'mg_levels' = 0,使用尽可能多的级别。如果图像大小不允许使用指定数量的级别,则使用尽可能多的级别。通常,'mg_levels'应该设置为0。

MGParamName = 'mg_cycles'可用于指定正在执行的V或W纠正周期的总数。如果使用完整的多重网格算法,“mg_cycles”表示从粗到细的初始化的每个水平。通常,一个或两个周期足够产生一个足够精确的方程组的解。通常,“mg_cycles”越大,数值结果越精确。该参数几乎线性地影响计算时间,即若将循环数加倍,则计算时间约为原来的两倍。

MGParamName = 'mg_pre_relax'可用于指定在执行实际错误纠正之前,使用迭代基本求解器在V或W纠正周期的每个水平上执行的迭代次数。通常,一个或两个预松弛步骤就足够了。通常,“mg_pre_relax”越大,数值结果就越准确。

MGParamName = 'mg_post_relax'可用于指定在实际执行错误纠正后,使用迭代基本求解器在V或W纠正周期的每个水平上执行的迭代次数。通常,一个或两个后松弛步骤就足够了。通常,“mg_post_relax”越大,数值结果就越准确。

就像增加校正周期的数目,增加预松弛和后松弛步骤的数目会渐进线性地增加计算时间。但是,不执行额外的限制和延长操作(放大和缩小错误纠正图像)。因此,适当增加松弛步骤的数量只会略微增加计算时间。

MGParamName = 'mg_inner_iter'可用于指定非线性基本求解器每次定点迭代求解线性方程组的迭代次数。通常情况下,一次迭代就足以达到多重网格算法足够的收敛速度。计算时间的增加略小于松弛步骤的增加。这个参数只影响FDRIG和DDRAW算法,因为CLG算法不需要求解非线性方程组。

如上所述,通常使用MGParamName = 'default_parameters'和MGParamValue = 'very_accurate'、'accurate'、'fast_accurate'或'fast'为上述参数使用一个默认参数集就足够了。如果需要,可以在MGParamName和MGParamValue中的‘default_parameters’后面指定上述参数的子集和相应的值(例如,MGParamName =['default_parameters','warp_zoom_factor']和MGParamValue =[' accurate',0.6]),从而在选择默认参数集之后修改单个参数。

五、默认参数集对上述参数使用以下值:

'default_parameters' = 'very_accurate': 'warp_zoom_factor' = 0.5, 'warp_levels' = 0, 'warp_last_level' = 1, 'mg_solver' = 'full_multigrid', 'mg_cycle_type' = 'w', 'mg_levels' = 0, 'mg_cycles' = 1, 'mg_pre_relax'=2,'mg_post_relax'=2,'mg_inner_iter'=1.

'default_parameters' = 'accurate': 'warp_zoom_factor' = 0.5, 'warp_levels' = 0, 'warp_last_level' = 1, 'mg_solver' = 'multigrid', 'mg_cycle_type' = 'v', 'mg_levels' = 0, 'mg_cycles' = 1, 'mg_pre_relax' = 1, 'mg_post_relax' = 1, 'mg_inner_iter' = 1.

'default_parameters' = 'fast_accurate': 'warp_zoom_factor' = 0.5, 'warp_levels' = 0, 'warp_last_level' = 2, 'mg_solver' = 'full_multigrid', 'mg_cycle_type' = 'w', 'mg_levels' = 0, 'mg_cycles' = 1, 'mg_pre_relax'=2,'mg_post_relax'=2,'mg_inner_iter'=1.

'default_parameters' = 'fast': 'warp_zoom_factor' = 0.5, 'warp_levels' = 0, 'warp_last_level' = 2, 'mg_solver' = 'multigrid', 'mg_cycle_type' = 'v', 'mg_levels' = 0, 'mg_cycles' = 1, 'mg_pre_relax' = 1, 'mg_post_relax' = 1, 'mg_inner_iter' = 1.

需要注意的是,对于CLG算法,'fast_accurate'和'fast'两种模式与'very_accurate'和'accurate'是相同的,因为CLG算法没有使用由粗到细的扭曲策略。

derivate_vector_field:用高斯函数的导数卷积向量场。

derivate_vector_field(VectorField : Result : Sigma, Component : )

derivate_vector_field将向量场的分量与高斯函数的导数进行卷积,并计算由此得到的各种特征。derivate_vector_field只接受语义类型为“vector_field_relative”的向量场。VectorField F(r,c)=(u(r,c), v(r,c))由optical_flow_mg定义。Sigma是高斯函数的参数(平滑量)。如果在Sigma中传递一个值,那么在列和行方向上的平滑量是相同的。如果在Sigma中传递两个值,第一个值指定列方向的平滑量,第二个值指定行方向的平滑量。组件的可能值为:

“curl”:向量场的卷曲。卷曲的一个应用是分析光流场。打个比方,卷曲是指如果向量场是流体,小船会旋转多少次。

“divergence”:向量场的散度。“散度”的一个应用是分析光流场。打个比方,如果向量场是流体,散度就是源头和汇集的位置。

当在光度立体上下文中使用时,算子derivate_vector_field提供了另外两个参数,它们专门用于处理photometric_stereo返回的梯度场。在这种情况下,我们将输入向量场解释为下垫面的梯度。

在下面的公式中,输入向量场记作:

其中输入的第一个和第二个分量是曲面f(r,c)的梯度场。式中f_rc表示梯度场第一分量在列方向上的一阶导数。

“mean_curvature”:当输入向量场VectorField解释为梯度场时,下垫面的平均曲率H。使用“平均曲率”的一个应用是处理photometric_stereo返回的向量场。对向量场进行滤波后,甚至可以分割出微小的划痕或凸起。

“gauss_curvature”:当输入向量场VectorField被解释为梯度场时,下垫面的高斯曲率K。使用'gauss_curvature'的一个应用程序是处理photometric_stereo返回的向量场。对向量场进行滤波后,甚至可以分割出微小的划痕或凸起。如果向量场的下表面是可展的,高斯曲率为零。

unwarp_image_vector_field:使用向量场反扭曲图像。

unwarp_image_vector_field(Image, VectorField : ImageUnwarped : : )

unwarp_image_vector_field使用向量场VectorField反扭曲图像Image,并在ImageUnwarped中返回反扭曲的图像。向量场必须是语义类型“vector_field_relative”,通常由optical_flow_mg确定。因此,unwarp_image_vector_field可用于将optical_flow_mg的第二个输入图像反扭曲到第一个输入图像。需要注意的是,由于上述语义,向量场图像表示从向量场的目标图像到源图像的逆变换。

vector_field_length:计算向量场的向量长度。

vector_field_length(VectorField : Length : Mode : )

vector_field_length计算向量场VectorField的长度并返回Length。vector_field_length只接受语义类型“vector_field_relative”的向量场。参数模式可用于指定如何计算长度。对于Mode = 'length',计算向量的欧氏长度。对于Mode = 'squared_length',计算向量长度的平方。这避免了在内部计算平方根,这在许多处理器上是一个费时的操作,因此节省了这些处理器上的运行时。注意VectorField必须在optical_flow_mg返回的相对坐标中。

六、本文的支持文章

《光流法基本原理和函数》(待完成)

《能量法原理》(待完成)

 《Gauss-Seidel迭代的python解法》(完成)

 参考文章:

Halcon: optical_flow_mg - 『潇洒の背影』 - 博客园 (cnblogs.com)

explore_halcon.hdev(21)之p_do_optical_flow_bicycle函数模块 | 码农家园


网站公告

今日签到

点亮在社区的每一天
去签到