Halcon算子知识:optical_flow_mg
一、說明
????????本文是對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)。
????????所有三種方法都是變分方法,它們將光流計算為合適能量函數的最小值。一般來說,能量泛函具有以下形式:
???????????????????????????????????????????????????????
????????其中 ?是要確定的光流矢量場(在第三個坐標中的時間步長為 1)。圖像序列被視為一個連續函數,其中 ?和??? ?表示位置,t 表示時間。此外,表示數據項,而?表示平滑度項,是決定解的平滑度的正則化參數。正則化參數在 FlowSmoothness 中傳遞。雖然數據項編碼了關于連續圖像中對象特征的恒定性的假設,例如,灰度值的恒定性或灰度值的一階空間導數的恒定性,但平滑性項編碼了關于(分段)平滑度的假設解,即要確定的向量場的平滑度。
3.1 FDRIG 算法基于包含以下假設的能量函數的最小化
????????灰度值的恒定性:假設一個圖像序列的連續圖像中對應的像素具有相同的灰度值,即 f(r+u,c+v,t+1) = f(r,c,t )。這可以使用向量表示法更簡潔地寫為 f(x+w) = f(x)。
????????空間灰度值導數的恒定性:假設圖像序列的連續圖像中的相應像素另外具有相同的空間灰度值導數,即也成立,其中????????。這可以更緊湊地寫為 .與灰度值恒常性相比,梯度恒常性具有對加性全局光照變化不變的優點。
????????大位移:假設發生大位移,即大于一個像素的位移。在這種假設下,有意識地避免在模型中使用通常在文獻中提出的恒常性假設的線性化是有意義的。
????????數據項中的統計穩健性:為了減少異常值的影響,即違反恒常性假設的點,它們以統計穩健的方式受到懲罰,即,習慣的非穩健二次懲罰被替換為線性懲罰通過 ,其中是一個固定的正則化常數。
?流場 I 中不連續性的保留:假設解是分段平滑的。雖然實際平滑度是通過對流的一階導數進行懲罰來實現的且,但使用統計上穩健的(線性)懲罰函數提供了所要確定的流場中運動邊緣的所需保留。這種類型的平滑項稱為流動驅動和各向同性。
?考慮到以上所有假設,FDRIG 算法的能量泛函可以寫為?
?這里,是 FlowSmoothness 中傳遞的正則化參數,而 是GradientConstancy 中傳遞的是梯度恒定權重。這兩個參數構成了 FDRIG 算法的模型參數,下面將更詳細地描述。
3.2 DDRAW 算法基于包含以下假設的能量泛函的最小化
灰度值的恒定性:假設圖像序列的連續圖像中的對應像素具有相同的灰度值,即f(x+w) = f(x)。
大位移:假設發生大位移,即大于一個像素的位移。在這種假設下,有意識地避免在模型中使用通常在文獻中提出的恒常性假設的線性化是有意義的。
????數據項中的統計穩健性:為了減少異常值的影響,即違反恒常性假設的點,它們以統計穩健的方式受到懲罰,即,習慣的非穩健二次懲罰被替換為線性懲罰通過 ,其中是一個固定的正則化常數。
流場中不連續性的保留 II:假設解是分段平滑的。與 FDRIG 算法允許處處不連續性不同,DDRAW 算法只允許原始圖像邊緣處的不連續性。在這里,局部平滑度以這樣一種方式控制,即流場在圖像邊緣上是清晰的,而沿圖像邊緣是平滑的。這種類型的平滑項稱為數據驅動和各向異性。DDRAW 算法的所有假設都可以組合成以下能量泛函:
其中 是正交于 的歸一化投影矩陣,其中:
????????
?持有。該矩陣確保僅沿圖像邊緣假設流場的平滑度。相比之下,沒有對跨圖像邊緣的平滑度進行假設,從而導致跨圖像邊緣可能出現解中的不連續性這一事實。在這方面,用作防止投影矩陣變得奇異的正則化參數。與 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函數模塊 | 碼農家園
總結
以上是生活随笔為你收集整理的Halcon算子知识:optical_flow_mg的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 音频识别知识:采样
- 下一篇: 关于雅可比迭代的Python实现