photometric_stereo halcon光度立體法三維表面重建

官方文檔翻譯

  • 名稱: photometric_stereo -- 經過光度立體技術重建表面。
  • 簽名: photometric_stereo(Images : HeightField, Gradient, Albedo : Slants, Tilts, ResultType, ReconstructionMethod, GenParamName, GenParamValue : )
  • 描述:
    photometric_stereo能夠用來從一個物體的兩維紋理,例如它的打印照片,來區分出它的三維形狀。這個算子須要至少須要三張使用已知的不一樣方向的光源拍攝的相同物體的圖像。注意,拍攝這些照片時,相機的視角應該是固定的。(譯者注:即固定相機和物體,從多個已知的不一樣方向打光拍攝)
    物體的這種三維形狀從根本上來講是經過計算3維表面的局部梯度。這些梯度能夠被進一步綜合起來獲取到一個高度場,也就是說,一張圖片的每一個像素都與一個相對高度相關聯。(譯者注:計算得出的)二維的紋理被稱爲反照率,與對局部光源的吸取和反射表面特徵有關,把全部的陰影都排除在外。算法

    • 光照立體法的典型應用
      光照立體法的典型應用是用來檢測表面的變化,這種變化可能意味着缺陷,或者被用來將拍照時光照角度的影響排除在外,例如用於非扁平字符的打印檢查。注意,光度立體法不適用於重建絕對高度,也就是說,它不能替代傳統的3D重建算法,如對焦測距和激光三角測量。數組

    • 光度立體法的侷限性
      光度立體法是基於Woodham算法,所以假設相機表現爲無畸變的投影。這也就意味着,你必須使用一個遠心鏡頭或者長焦鏡頭。另外一方面,它假設了每一個光源發出的都是平行的等截面的光。這也就是說,你使用的照明必須是遠心光源,有着均勻的強度,或者做爲替代,遠距離的點光源。此外,這個物體必須有朗伯反射特性,也就是說它對光的反射是漫反射。有鏡面反射的物體或者區域(鏡子或者光滑的表面)不能被正確處理,會獲得一個錯誤的結果。多線程

    • 照片採集設置
      這個使用遠心鏡頭的相機必須被放置得和被重建的平面正交,即互相垂直。相機和平面的角度在採集過程當中必定不能改變。相反,光源和平面的夾角必須至少改變三次來獲取三張灰度圖片。函數

    • 具體說明光照的角度
      對每張圖片,光線的方向用兩個角度來表示,使用參數Slants和Tilts,這兩個參數描述了光線和平面的方向。來理解一下這兩個參數,記住,光源被假設發出的是平行光,照相機有一個遠心鏡頭,相機被放置在重建表面的正交方向。
      • Slants
        這個角度指的是相機的光軸和光線的夾角。如圖:
        Slantsui

      • Tilts
        這個角度使用物體平面或者其餘與之平行的平面,例如圖片表面來進行測量。特別的,它描述了圖片中心點向右延伸和光線方向投影到平面上的夾角。也即,當在看圖片或者相關的平面時,一個0度的角意味着光從右邊來,90度意味着光從頂上來,180度意味着光從左邊來,等等。如圖:
        Tilts線程

      正如以前所說的,光度立體法須要至少三張光線不一樣狀況下拍攝的照片。然而,一個三維的幾何體一般會有陰影。在陰影區域,光線有效方向的數量(the number of effectively available directions of illumination)被削減了,這會致使不明確(譯者注:ambiguities?模棱兩可?)。儘管如此,獲取一個魯棒性好的結果,贅餘是須要的。所以,一般會使用超過三個不一樣方向的光源。可是記住,光線方向的增長,會致使更多的圖片須要被處理,所以須要花費更多的處理時間。在絕大多數應用中,4-6個光源是合理的。根據經驗法則,slant角度會在30°-60°之間選擇。Tilt角度一般會均等得分佈在被測物體的周圍。請記住,光線的角度必須是通過選擇的,以使得他們(譯者注:他們是指?)可以不在同一平面上(即:光線的方向必須是獨立的)。不然,計算會失敗,程序會拋出一個異常。翻譯

    • 輸入圖片和定義的區域
      圖片必須以一個圖片數組輸入。如前所述:每張圖片必須是使用不一樣的光線角度的。若是圖片是經過存儲在多通道圖片中的,經過 image_to_channels 能夠容易地轉換爲圖片數組。做爲替代,圖片數組能夠經過 concat_obj 來建立。
      光度立體法依賴於對光度測定信息的評估,也就是存儲在圖像中的灰度值。所以,這些信息應當是無偏而且是準確的。咱們建議保證用來採集圖像的相機有線性特徵。若是有非線性特徵,你可使用算子 radiometric_self_calibration 來測定你的相機的特徵,使用 lut_trans 來校訂灰度信息。此外,若是須要精確的測量,咱們建議運用相機的全動態範圍,由於這能夠得到更精確的灰度信息。爲了相同的緣由,使用高於8位深度(bit-depth)的圖像(例如:使用uint2的圖像(譯者注:灰度範圍0~65535)而不是byte(0~255)類型的圖像)能夠帶來更高的準確率。
      輸入圖像的定義域決定了內部會使用哪種算法來處理圖像。有三種可用的算法:
      * 若是整個圖像都是定義域(譯者注:能夠理解爲這張圖的每一個像素點都有灰度值),會使用最快的算法。這被推薦使用在大多數的應用中。
      * 若是輸入的圖像共享了相同的削減過的定義域,只有定義域內的像素會被處理。這種模式會被用來排除圖像上的某些區域。一般的,已知顯示出非朗伯反射特性或者不感興趣的區域會被排除,例如表面的孔洞。(譯者注:每張圖的定義域都是相同的)
      * 若是提供了包含清晰定義域的圖像,每張圖像上包含在範圍內的灰度值會被使用。只有在三張圖像上擁有獨立的slant和tilt角度的像素會被處理(譯者注:?only those pixels are processed that have independent slant and tilt angles in at least three images)。這種模式在某些狀況下是合適的,例如在圖像處理時排除個別圖像上的特別的區域。這些區域多是已知的表現出非朗伯反射特性的區域或者包含了偏光信息的區域,例如影子。排除這些點能夠致使更準確的結果。請注意,最後一種模式與前兩種相比,顯著須要更多的處理時間。(譯者注:這種狀況下每張圖片的定義域都有可能不一樣)code

    • 輸出圖片
      這個算子輸出了重建圖像的梯度,反射率,和表面的高度場圖像。
      * 梯度圖像是一個向量場,包含了表面的偏導數。記住,梯度能夠被用做算子 reconstruct_height_field_from_gradient 的輸入參數。爲了更直觀的目的,替表明面梯度,能夠返回標準化以後的表面梯度。爲了達到這樣的目的,'ResulltType' 必須被設置爲 normalized_gradient 而不是 gradient。這裏,行和列元素表明了標準化以後的行和列。若是 ResultType被設置爲了 all ,就會使用gradient 而不是 normalized_gradient
      * 反射率圖像描述了反射輻射和入射輻射的比例,數值在1(白色表面)-0(黑色表面)之間。所以,反射率是表面的一個特徵。舉個例子,對一個印刷表面來講,反射率與把全部入射光排除在外(陰影,明暗)的印刷圖片有關。
      * 高度場圖像的每一個像素與相對高度相關。orm

    默認狀況下,上面這些對象都會返回,也就是說,參數ResultType設置爲all。在只須要某些結果的狀況下,這個參數能夠設置爲數組,僅將一些須要的值放在其中,能夠放的值有'gradient', 'albedo', 和 'height_field'。記住,在特定的應用中,像表面檢測任務,只有梯度和反射率圖像是有須要的。這裏,不構建高度場圖像能夠顯著得增快重建的速度。
    記住,在光度立體法內部,最早計算出梯度值,若是有須要,結合這些值來獲取高度場。這個結合操做與 reconstruct_height_field_from_gradient 使用的是相同的算法,他們能夠經過參數ReconstructionMethod, GenParamName, 和 GenParamValue進行控制。請參閱reconstruct_height_field_from_gradient的幫助來獲取更多關於這些參數的信息。若是ResultType中沒有height_field,那麼這幾個參數會被忽略。對象

  • 注意
    photometric_stereo基於方形像素的假定。此外,它假定在物體空間內,高度在步幅是1的格子上計算出來的。若是不是這種狀況,相機的像素投射到物體表面不是1,返回的高度場必須乘上實際的步長(像素尺寸投射都物體空間的值)。像素在物體空間的尺寸經過相機中的像素尺寸除以被鏡頭放大的倍數獲得。

  • 執行信息
    • 多線程類型:可重入(能夠和非排他性算子並行運行)
    • 多線程做用域:全局(可能在任意線程中調用)
    • 在內部數據層級上自動並行處理
  • 參數
    略。

  • 結果
    若是參數是有效的,返回2。若是有必要,會拋出異常。

  • 可能的前調函數
    optimize_fft_speed

  • 所屬模塊
    三維計量

圖片來源於官方文檔

相關文章
相關標籤/搜索