天天看點

halcon模闆比對實踐(1)算子參數說明與算子簡介

一、先來看理論:

摘自論文《基于HDevelop的形狀比對算法參數的優化研究》

1. Shape-Based matching的基本流程

HALCON提供的基于形狀比對的算法主要是針對感興趣的小區域來建立模闆,對整個圖像建立模闆也可以,但這樣除非是對象在整個圖像中所占比例很大,比如像視訊會議中人體上半身這樣的圖像,我在後面的視訊對象跟蹤實驗中就是針對整個圖像的,這往往也是要犧牲比對速度的,這個後面再講。基本流程是這樣的,如下所示:

⑴首先确定出ROI的矩形區域,這裡隻需要确定矩形的左上點和右下點的坐标即可,gen_rectangle1()這個函數就會幫助你生成一個矩形,利用area_center()找到這個矩形的中心;

⑵然後需要從圖像中擷取這個矩形區域的圖像,reduce_domain()會得到這個ROI;這之後就可以對這個矩形建立模闆,而在建立模闆之前,可以先對這個區域進行一些處理,友善以後的模組化,比如門檻值分割,數學形态學的一些處理等等;

⑶接下來就可以利用create_shape_model()來建立模闆了,這個函數有許多參數,其中金字塔的級數由Numlevels指定,值越大則找到物體的時間越少,AngleStart角度起始值和AngleExtent是角度的旋轉範圍,AngleStep指定角度範圍搜尋的步長;這裡需要提醒的是,在任何情況下,模闆應适合主記憶體,搜尋時間會縮短。對特别大的模闆,用Optimization來減少模闆點的數量是很有用的;MinConstrast将模闆從圖像的噪聲中分離出來,如果灰階值的波動範圍是10,則MinConstrast應當設為10;Metric參數決定模闆識别的條件,如果設為’use_polarity’,則圖像中的物體和模闆必須有相同的對比度;建立好模闆後,這時還需要監視模闆,用inspect_shape_model()來完成,它檢查參數的适用性,還能幫助找到合适的參數;另外,還需要獲得這個模闆的輪廓,用于後面的比對,get_shape_model_contours()則會很容易的幫我們找到模闆的輪廓;

⑷建立好模闆後,就可以打開另一幅圖像,來進行模闆比對了。這個過程也就是在新圖像中尋找與模闆比對的圖像部分,這部分的工作就由函數find_shape_model()來承擔了,它也擁有許多的參數,這些參數都影響着尋找模闆的速度和精度。這個的功能就是在一幅圖中找出最佳比對的模闆,傳回一個模闆執行個體的長、寬和旋轉角度。其中參數SubPixel決定是否精确到亞像素級,設為’interpolation’,則會精确到,這個模式不會占用太多時間,若需要更精确,則可設為’least_square’,’lease_square_high’,但這樣會增加額外的時間,是以,這需要在時間和精度上作個折中,需要和實際聯系起來。比較重要的兩個參數是MinSocre和Greediness,前一個用來分析模闆的旋轉對稱和它們之間的相似度,值越大,則越相似,後一個是搜尋貪婪度,這個值在很大程度上影響着搜尋速度,若為0,則為啟發式搜尋,很耗時,若為1,則為不安全搜尋,但最快。在大多數情況下,在能夠比對的情況下,盡可能的增大其值。

⑸找到之後,還需要對其進行轉化,使之能夠顯示,這兩個函數vector_angle_to_rigid()和affine_trans_contour_xld()在這裡就起這個作用。前一個是從一個點和角度計算一個剛體仿射變換,這個函數從比對函數的結果中對構造一個剛體仿射變換很有用,把參考圖像變為目前圖像。

(6)Optimization(優化):定義模闆定位時使用的特征點的數量,在模闆資料量大時有必要降低資料量(point_reduction_high),以提高定位速度,預設為auto;

(7)Metric:比對極性參數,ignore_globle_polarity可以為目标與模闆極性完全相反(globle的);ignore_local_polarity為允許部分極性相反;ignore_color_polarity用在單通道圖像上效果與ignore_local_polarity效果相同,use_polarity與ignore_globle_polarity僅能用在亞像素精度上;ignore_part_polarity允許不同極性部分之間的變化,極性相同的部分内部不得改變,應是包含ignore_globle_polarity;

If Metric = 'use_polarity', the object in the image and the model must have the same contrast.

如果使用use_polarity,圖像中的對象和模型必須具有相同的對比度。

(8)ParamName與ParamValue:設定參數名稱與值,預設為空;part_size為目标所組成輪廓的大小,參考可能為目标整體的大小與細節的複雜度,一般不需要使用;

(9)Greediness:啟發式搜尋啟用等級,0最高但速度慢,1最快但可能會錯漏;

(10)ResultType:顯示結果圖形,image_rectified為校正後圖形,rector_field為網格線顯示,deformed_contours為變形輪廓

2. 基于形狀比對的參數關系與優化

    在HALCON的說明資料裡講到了這些參數的作用以及關系,在上面提到的文章中也作了介紹,這裡主要是重複說明一下這些參數的作用,再強調一下它們影響比對速度的程度;

在為了提高速度而設定參數之前,有必要找出那些在所有測試圖像中比對成功的設定,這時需考慮以下情況:

①     必須保證物體在圖像邊緣處截斷,也就是保證輪廓的清晰,這些可以通過形态學的一些方法來處理;

②     如果Greediness值設的太高,就找不到其中一些可見物體,這時最後将其設為0來執行完全搜尋;

③     物體是否有封閉區域,如果要求物體在任何狀态下都能被識别,則應減小MinScore值;

④     判斷在金字塔最進階上的比對是否失敗,可以通過find_shape_model()減小NumLevels值來測試;

⑤     物體是否具有較低的對比度,如果要求物體在任何狀态下都能被識别,則應減小MinContrast值;

⑥     判斷是否全局地或者局部地轉化對比度極性,如果需要在任何狀态下都能被識别,則應給參數Metric設定一個合适的值;

⑦     物體是否與物體的其他執行個體重疊,如果需要在任何狀态下都能識别物體,則應增加MaxOverlap值;

⑧     判斷是否在相同物體上找到多個比對值,如果物體幾乎是對稱的,則需要控制旋轉範圍;

如何加快搜尋比對,需要在這些參數中進行合理的搭配,有以下方法可以參考:

①       隻要比對成功,則盡可能增加參數MinScore的值;

②       增加Greediness值直到比對失敗,同時在需要時減小MinScore值;

③       如果有可能,在建立模闆時使用一個大的NumLevels,即将圖像多分幾個金字塔級;

④       限定允許的旋轉範圍和大小範圍,在調用find_shape_model()時調整相應的參數;

⑤       盡量限定搜尋ROI的區域;

除上面介紹的以外,在保證能夠比對的情況下,盡可能的增大Greediness的值,因為在後面的實驗中,用模闆比對進行視訊對象跟蹤的過程中,這個值在很大程度上影響到比對的速度。

當然這些方法都需要跟實際聯系起來,不同圖像在比對過程中也會有不同的比對效果,在具體到某些應用,不同的硬體設施也會對這個比對算法提出新的要求,是以需要不斷地去嘗試。在接下來我會結合自己做的具體的實驗來如何利用HALCON來進行實驗,主要是在視訊對象分割和視訊對象的跟蹤方面。

進一步分析:

NumLevels越大,找到比對使用的時間就越小。另外必須保證最高層的圖像具有足夠的資訊(至少四個點)。可以通過inspect_shape_model函數檢視設定的結果。如果最高層金字塔的資訊太少,算法内部會自動減少金字塔層數,如果最底層金字塔的資訊太少,函數就會報錯。如果設為auto,算法會自動計算金字塔的層數,我們可以通過get_shape_model_params函數檢視金字塔的層數。如果金字塔的層數太大,模闆不容易識别出來,這時需要将find_shape_model函數中MinScore和Greediness參數設定的低一些。如果金字塔層數太少找到模闆的時間會增加。可以先使用inspect_shape_model函數的輸出結果來選擇一個較好的金字塔層數。

參數AngleStart、AngleExtent定義了模闆可能發生旋轉的範圍。注意模闆在find_shape_model函數中隻能找到這個範圍内的比對。參數 AngleStep定義了旋轉角度範圍内的步長。 如果在find_shape_model函數中沒有指定亞像素精度,這個參數指定的精度是可以實作find_shape_mode函數中的角度的。參數AngleStep的選擇是基于目标的大小的,如果模闆圖像太小不能産生許多不同離散角度的圖像,是以對于較小的模闆圖像AngleStep應該設定的比較大。如果AngleExtent不是 AngleStep的整數倍, 将會相應的修改AngleStep 。

如果選擇 complete pregeneration ,不同角度的模闆圖像将會産生并儲存在記憶體中。用來存儲模闆的記憶體與旋轉角度的數目和模闆圖像的的點數是成正比的。 是以,如果AngleStep太小或是AngleExtent太大, 将會出現該模型不再适合(虛拟)記憶體的情況。在任何情況下,模型是完全适合主存儲器的,因為這避免了作業系統的記憶體分頁,使得尋找比對模闆的時間變短。由于find_shape_model函數中的角度可以使用亞像素精度,一個直徑小于200像素的模闆可以選擇AngleStep >= 1. 如果選擇AngleStep='auto' (or 0 向後相容), create_shape_model将會基于模闆的大小自動定義一個合适的角度步長. 自動計算出來的AngleStep 可以使用get_shape_model_params函數檢視。

如果沒有選擇complete pregeneration, 該模型會在每一層金字塔上建立在一個參考的位置。這樣在find_shape_model函數運作時,該模型必須轉化為不同的角度和尺度在運作時在。正因為如此,比對該模型可能需要更多的時間。

對于特别大的模闆圖像,将參數Optimization設定為不同于'none'的其他數值是非常有用的。如果Optimization = 'none', 所有的模型點将要存儲。在其他情況下, 按照Optimization的數值會将模型的點數減少. 如果模型點數變少了,必須在find_shape_model函數中将參數Greediness設為一個比較小的值, 比如:0.7、0.8。對于比較小的模型, 減少模型點數并不能提高搜尋速度,因為這種情況下通常顯着更多的潛在情況的模型必須進行檢查。如果Optimization設定為'auto', create_shape_model自動确定模型的點數。

Optimization的第二個值定義了模型是否進行預處理(pregenerated completely),是通過選擇'pregeneration'或者'no_pregeneration'來設定的。如果不使用第二個值(例如:僅僅設定了第一個值), 預設的是系統中的設定,是通過set_system('pregenerate _shape_models',...)來 設定的,對于預設值是 ('pregenerate_shape_models' = 'false'), 模型沒有進行預處理. 模型的預處理設定通常會導緻比較低的運作時間,因為模型不需要 在運作時間時轉換。然而在這種情況下,記憶體的要求和建立模闆所需要的時間是比較高的。 還應該指出,不能指望這兩個模式傳回完全相同的結果,因為在運作時變換一定會導緻變換模型和預處理變換模型之間不同的内部資料。比如,如果模型沒有 completely pregenerated,在find_shape_model函數中通常傳回一個較低的scores,這可能需要将MinScore設定成一個較低的 值(相似度)。此外,在兩個模型中插值法獲得的位置可能略有不同。如果希望是最高精确度,應該使用最小二乘調整得到模型位置。

參數Contras決定着模型點的對比度。對比度是用來測量目标與背景之間和目标不同部分之間局部的灰階值差異。Contrast的選擇應該確定模闆中的主要特征用于模型中。Contrast也可以是兩個數值,這時模闆使用近似edges_image函數中滞後門檻值的算法進行分割。這裡第一個數值是比較低的門檻值,第二個數值是比較高的門檻值。Contrast也可以包含第三個,這個數值是在基于元件尺寸選擇重要模型元件時所設定的門檻值,比如,比指定的最小尺寸的點數還少的元件将被抑制。這個最小尺寸的門檻值會在每相鄰的金字塔層之間除以2。如果一個小的模型元件被抑制,但是不使用滞後門檻值,然而在Contrast中必須指定三個數值,在這種情況下前兩個數值設定成相同的數值。這個參數的設定可以在inspect_shape_model函數中檢視效果。如果Contrast設定為'auto',create_shape_model将 會自動确定三個上面描述的數值。或者僅僅自動設定對比度('auto_contrast'),滞後門檻值('auto_contrast_hyst')或是 最小尺寸('auto_min_size')中一個。其他沒有自動設定的數值可以按照上面的格式再進行設定。可以允許各種組合,例如:如果設定 ['auto_contrast','auto_min_size'],對比度和最小尺寸自動确定;如果設定 ['auto_min_size',20,30],最小尺寸會自動設定,而滞後門檻值被設為20和30。有時候可能對比度門檻值自動設定的結果是不滿意的,例 如,由于一些具體應用的原因當某一個模型元件是被包含或是被抑制時,或是目标包含幾種不同的對比度時,手動設定這些參數效果會更好。是以對比度門檻值可以使 用determine_shape_model_params函數自動确定,也可以在調用create_shape_model之前使用inspect_shape_mode函數檢查效果。

MinContrast用來确定在執行find_shape_model函數進行識别時模型的哪一個對比度必須存在,也就是說,這個參數将模型從噪聲圖像中分離出來。是以一個好的選擇應該是在圖像中噪聲所引起的灰階變化範圍。例如,如果灰階浮動在10個灰階級内,MinContrast應該設定成10。如果模闆和搜尋圖像是多通道圖像,Metric參數設定成'ignore_color_polarity',在一個通道中的噪聲必須乘以通道個數的平方根再去設定MinContrast。例如,如果灰階值在一個通道的浮動範圍是10個灰階級,圖像是三通道的,那麼MinContrast應該設定為17。很顯然,MinContrast 必須小于Contrast。如果要在對比度較低的圖像中識别模闆,MinContrast必須設定為一個相對較小的數值。如果要是模闆即使嚴重遮擋(occluded)也能識别出來,MinContrast應該設定成一個比噪聲引起的灰階浮動範圍略大的數值,這樣才能確定在find_shape_model函數中提取出模闆準确的位置和旋轉角度。如果MinContrast設定為'auto',最小對比度會基于模闆圖像中的噪聲自動定義。是以自動設定僅僅在搜尋圖像和模闆圖像噪聲近似時才可以使用。此外,在某些情況下為了遮擋的魯棒性,采用自動設定數值是比較好的。使用get_shape_model_params函數可以查詢自動計算的最小對比度。

參數Metric定義了在圖像中比對模闆的條件。如果Metric = 'use_polarity',圖像中的目标必須和模型具有一樣的對比度。例如,如果模型是一個亮的目标在一個暗的背景上,那麼僅僅那些比背景亮的目标可以找到。如果Metric ='ignore_global_polarity',在兩者對比度完全相反時也能找到目标。在上面的例子中,如果目标是比背景暗的也能将目标找到。find_shape_model函數的運作時間在這種情況下将會略微增加。如果Metric = 'ignore_local_polarity', 即使局部對比度改變也能找到模型。例如,當目标包含一部分中等灰階,并且其中部分比較亮部分比較暗時,這種模式是非常有用的。由于這種模式下find_shape_model函數的運作時間顯著增加,最好的方法是使用create_shape_model建立幾個反映目标可能的對比度變化的模型,同時使用find_shape_models去比對他們。上面三個metrics僅僅适用于單通道圖像。

如果是多通道圖像作為模闆圖像或搜尋圖像,僅僅第一個通道被使用。如果Metric='ignore_color_polarity', 即使顔色對比度局部變化也能找到模型。例如,當目标的部分區域顔色發生變化(e.g.從紅到綠)的情況。如果不能提前知道目标在哪一個通道是可見的這種模式是非常有用的。在這種情況下find_shape_model函數的運作時間也會急劇增加。'ignore_color_polarity'可以使用于具有任意通道數目的圖像中。如果使用于單通道圖像,他的效果和'ignore_loc al_polarity'是完全相同的。

當Metric='ignore_color_polarity' 時,create_shape_model建立的模闆通道數目和find_shape_model中的圖像通道數目可以是不同的。例如,可以使用綜合生成的單通道圖像建立模型。另外,這些通道不需要是經過光譜細分(像RGB圖像)的。這些通道還可以包括具有在不同方向照亮同一個目标所獲得的圖像。

模型圖像Template的domain區域的重心是模闆的初始位置,可以在set_shape_model_origin函數中設定不同的初始位置。

二、比對方式的選擇

基于元件的模闆比對:

應用場合:元件比對是形狀比對的擴充,但不支援大小縮放比對,一般用于多個對象(工件)定位的場合。

算法步驟:

1.擷取元件模型裡的初始控件 gen_initial_components()

參數:

ModelImage [Input] 初始元件的圖檔

InitialComponents [Output] 初始元件的輪廓區域

ContrastLow [Input] 對比度下限

ContrastHigh [Input] 對比度上限

MinSize [Input] 初始元件的最小尺寸

Mode[Input] 自動分段的類型

GenericName [Input] 可選控制參數的名稱

GenericValue [Input] 可選控制參數的值

2.根據圖像模型,初始元件,訓練圖檔來訓練元件群組件互相關系  train_model_components()

3.建立元件模型 create_trained_component_model()

4.尋找元件模型 find_component_model()

5.釋放元件模型 clear_component_model()

基于形狀的模闆比對:

應用場合:定位對象内部的灰階值可以有變化,但對象輪廓一定要清晰平滑。

1.建立形狀模型:create_shape_model()

2.尋找形狀模型:find_shpae_model()

3.釋放形狀模型:clear_shape_model()

基于灰階的模闆比對:

應用場合:定位對象内部的灰階值沒有大的變化,沒有缺失部分,沒有幹擾圖像和噪聲的場合。

1.建立模闆:create_template()

2.尋找模闆:best_match()

3.釋放模闆:clear_template()

基于互相關比對:

應用場合:搜尋對象有輕微的變形,大量的紋理,圖像模糊等場合,速度快,精度低。

1.建立模闆:create_ncc_model()

2.尋找模闆:find_ncc_model()

3.釋放模闆:clear_ncc_model()

基于變形比對:

應用場合:搜尋對象有輕微的變形。

1.建立模闆:create_local_deformable_model()

2.尋找模闆:find_local_deformable_model()

3.釋放模闆:clear_deformable_model()

基于描述比對:

應用場合:搜尋對象有輕微的變形,透視的場合,根據一些描述點的位置和灰階值來進行比對。

1.建立模闆:create_calib_descriptor_model()

2.尋找模闆:find_calib_descriptor_model()

3.釋放模闆:clear_descriptor_model()

三、實踐

1、形狀比對,shape,XY異步縮放

read_image (Image, 'C:/Users/test/Desktop/match/minSampel1.jpg')

*rgb1_to_gray (Image, GrayImage1)

anisotropic_diffusion(Image, ImageAniso, 'perona-malik', 5, 1, 3)

*讀取檔案中的模闆

read_shape_model('C:/Users/test/Desktop/match/modelData1.shm', ModelID)

*模型比對

dev_display (Image)

*參數說明:

*1、要比對的圖元 2、模型句柄 3、模型最小旋轉角 4、模型最大旋轉角 5、行方向的最小縮放比 6、行方向最大縮放比 7、列方向最小縮放比 8、列方向最大縮放比 9、找到模型的最小分數

*10、找到模型的數量 11、模型的最大重疊 12、亞像素精度 13、金字塔數 14、貪婪值 15、16找到的圖像的中心坐标;17、18行列的縮放比 20、得分

find_aniso_shape_model (Image, ModelID, rad(-20), rad(340), 0.9, 1.1, 0.9, 1.1, 0.1, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, ScaleR, ScaleC, Score)

for Index := 0 to |Row|-1 by 1

   disp_cross(3600, Row[Index], Column[Index], 100, Angle)

   disp_message(3600, '得分:'+Score[Index], 'image', Row[Index], Column[Index], 'black', 'false')

endfor

*釋放句柄

clear_shape_model (ModelID)

stop()

*參考文獻:halcon模闆比對快速入門

*https://blog.csdn.net/weixin_44490080/article/details/91412257

2、形狀比對,local_deformable

*C:/Users/Public/Documents/MVTec/HALCON-12.0/examples/hdevelop/Matching/Deformable
*Create the local deformable model with ignore_polarity as metric.
read_contour_xld_dxf (DxfContours, 'C:/Users/firecat/neiyi+1.dxf', [], [], DxfStatus)
Scale := 4
count_obj(DxfContours, NumberContours)
gen_empty_obj (ScaleContours)
for i := 1 to NumberContours by 1
    select_obj (DxfContours, ObjectSelected, i)
    get_contour_xld (ObjectSelected, row, col)
    Row1 := []
    Col1 := []
    for j := 0 to |row|-1 by 1   
        Row1:=[Row1, row[j] * Scale]
        Col1:=[Col1, col[j] * Scale]
    endfor
   
    *判斷輪廓是不是閉合,如果是閉合的,那麼使最後一個點與第一個點重合(即讓縮放後的XLD也閉合)
    test_closed_xld (ObjectSelected, IsClosed)
    if (IsClosed == 1)
        Row1:=[Row1, row[0] * Scale]
        Col1:=[Col1, col[0] * Scale]
    endif
   
    gen_contour_polygon_xld (Contour1, Row1, Col1)
    smooth_contours_xld (Contour1, SmoothedContours, 5)
    concat_obj (ScaleContours, SmoothedContours, ScaleContours)
endfor
*xld拼接
union_adjacent_contours_xld (ScaleContours, UnionContours, 10, 1, 'attr_keep')
* get_contour_xld (UnionContours, Row1, Col1)
*使用仿射變換實作鏡像,這裡是上下翻轉
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_reflect (HomMat2DIdentity, 0, 0, 0, 32, HomMat2DReflect)
affine_trans_contour_xld (UnionContours, ContoursAffinTrans, HomMat2DReflect)
*封閉
close_contours_xld (UnionContours, ClosedContours)
*建立模闆的方法1:使用xld
create_local_deformable_model_xld (ClosedContours, 'auto', rad(-20), rad(20), 'auto', 0.9, 1.1, 'auto', 0.9, 1.1, 'auto', 'auto', 'ignore_local_polarity', 5, [], [], ModelID1)
get_deformable_model_contours (ModelContours1, ModelID1, 1)
*建立模闆的方法2:讀取圖
read_image (modelImage, 'F:/tmp-source/halconmatchtest/halcontest/pic1/pic_model.jpg')
create_local_deformable_model (modelImage, 'auto', rad(-20), rad(20), 'auto', 0.9, 1.1, 'auto', 0.9, 1.1, 'auto', 'none', 'use_polarity', 'auto', 'auto', [], [], ModelID2)
get_deformable_model_contours (ModelContours2, ModelID2, 1)
*讀取待比對的圖檔
read_image (Image, 'F:/tmp-source/halconmatchtest/halcontest/pic1/pic_org4.jpg')
*local_deformable比對
count_seconds (Seconds1)
find_local_deformable_model (Image, ImageRectified, VectorField, DeformedContours, ModelID2, rad(-20), rad(20), 1, 1, 1, 1, 0.5, 0, 1, 0, 0.4, ['image_rectified','vector_field','deformed_contours'], ['deformation_smoothness','expand_border','subpixel'], [21, 0, 'least_squares'], Score, Row, Column)
count_seconds (Seconds2)
Time := 1000.0 * (Seconds2 - Seconds1)
*解析結果
count_obj(DeformedContours, NumberContours)
for i := 1 to NumberContours by 1
    select_obj (DeformedContours, ObjectSelected, i)
    get_contour_xld (ObjectSelected, row, col)
endfor
stop()
* For the visualization we use the returned vector field
* and generate a grid of the deformation in the search image.
gen_warped_mesh (VectorField, WarpedMesh, 10)
*把函數gen_warped_mesh展開,滑鼠右鍵,在新标簽頁顯示該函數:
gen_empty_obj (ModelMesh)
gen_empty_obj (WarpedMesh)
*VectorField是向量區域圖,記錄了模闆圖和待比對圖的映射關系,向量圖使用絕對坐标
count_obj (VectorField, Number)
Step:=10
for Index := 1 to Number by 1
    select_obj (VectorField, ObjectSelected, Index)
    *把vector向量圖轉換成存儲行坐标和列坐标圖像
    vector_field_to_real (ObjectSelected, DRow, DCol)
    *得到向量圖的分辨率大小,VectorField可能有多張圖,但是每張圖大小是一樣的
    get_image_size (VectorField, Width, Height)
   
    *Horizontal lines,畫水準線
    for ContR := 0.5 to Height[0] - 1 by Step       
        Col1 := [0.5:Width[0] - 1]
        *生成特定長度的元組及初始化元素
        *新元組生成的個數及值是由輸入參數Const決定的,Const隻由一個元素組成
        tuple_gen_const (Width[0] - 1, ContR, Row1)
        *Return gray values of an image at the positions given by tuples of rows and columns
        *DRow和DCol是模闆圖,Row1和Col1是模闆圖的坐标,GrayRow和GrayCol是映射之後的坐标
        *雙線性插值法
        get_grayval_interpolated (DRow, Row1, Col1, 'bilinear', GrayRow)
        get_grayval_interpolated (DCol, Row1, Col1, 'bilinear', GrayCol)
        gen_contour_polygon_xld (ModelContour, Row1, Col1)
        gen_contour_polygon_xld (Contour, GrayRow, GrayCol)
        *模闆圖和映射圖坐标做對比
        concat_obj (ModelMesh, ModelContour, ModelMesh)
        concat_obj (WarpedMesh, Contour, WarpedMesh)
    endfor
   
    *Vertical lines,畫垂直線
    for ContC := 0.5 to Width[0] - 1 by Step
        Row1 := [0.5:Height[0] - 1]
        tuple_gen_const (Height[0] - 1, ContC, Col1)
        get_grayval_interpolated (DRow, Row1, Col1, 'bilinear', GrayRow)
        get_grayval_interpolated (DCol, Row1, Col1, 'bilinear', GrayCol)
        gen_contour_polygon_xld (ModelContour, Row1, Col1)
        gen_contour_polygon_xld (Contour, GrayRow, GrayCol)
        concat_obj (ModelMesh, ModelContour, ModelMesh)
        concat_obj (WarpedMesh, Contour, WarpedMesh)
    endfor
endfor
dev_set_line_width (1)
dev_set_color ('yellow')
dev_display (ModelMesh)
dev_display (WarpedMesh)
dev_set_line_width (3)
dev_set_color ('red')
dev_display (ModelContours2)
dev_set_color ('green')
dev_display (DeformedContours)
* Clean up
clear_deformable_model (ModelID1)
clear_deformable_model (ModelID2)
stop()      

3、halcon算子參數ANGLE_EXTENT,該數值是旋轉範圍,注意:不是結束角度。

---

推薦閱讀

《圖像算法---Image Deformation Using Moving Least Squares》

http://vision.gel.ulaval.ca/~jflalonde/cours/4105/h14/tps/results/project/jingweicao/index.html

繼續閱讀