android opencv

關於透視變換原理及應用

王祥宇 2020/07/27 23:17:31
65
 

 

一、介紹
  1.
什麼是透視變換
          這是一個將現實世界(三維空間)的一個點
          投影在平面(二維空間)的一個過程
          
           如圖將三維空間的P點投影到二維空間的p

  2.原理

           怎麼做呢?

           先要了解幾個概念:
          (承上圖

§  什麼是世界座標?

§  也就是真實世界的立體空間座標,是一個三維座標系

§  圖片右方P點所在的座標系為世界座標系,描述相機位置,單位m

§  什麼是相機座標?

§  根據透鏡成像原理(就是上下顛倒、左右相反),將世界座標在照相機內呈現,也是一個三維座標系

§  圖片左邊原點O所在座標系為相機座標系,光心為原點,單位m

§  什麼是影象座標?

§  將相機呈現的三維座標投影到螢幕上,而建立的新座標系,不含高程資訊,是一個二維座標系

§  中間p點所在座標系為影象座標系,原點為成像平面中點,單位mm

§  什麼是畫素座標?

§  將投影的影象座標離散抽樣形成的做種圖片,是一個二維的座標系

§  p點為原點作為一個新座標系



   實際操作就是把世界座標系轉到相機座標系,這是一個剛體變換,
   也就是我們只對原本的世界座標系做旋轉、平移、縮放
   再來,將相機座標系投影到影像座標系

   最後把影像座標系做離散抽樣處理變成像素座標系


           專有名詞部分就不贅述,直接跳到計算
           這邊就要複習一下高中數學矩陣及三角函數,
            
            繞Z軸,轉化後的p(x,y,z)滿足x = x’cosθ+y’sinθ         y = y’sinθ+x’cosθ         z = z’
            矩陣形式為


    同理可得繞Y軸、繞X軸

 


    完整轉化算式為

    R矩陣是一個3×3矩陣,T是一個3×1矩陣,RT是一個4×4矩陣
    透過上面公式把世界座標系轉到相機座標系

 


    再來

    三角形幾何相似關係推導出下面算式

 

    

          


     一樣,上面這個轉換式讓
相機座標系投影到影像座標系

     三維終於轉到二維

 

 

 

     最後用雙線性插值

     
影像座標系xy的原點o轉化成像素座標uv原點Ouv 

     把p(x,y)換算成p(u,v)

     算法是先將x、y切成n份,每份長度為dx、dy 

     幾何關係如下


     矩陣寫成這樣


     整合這三步就變成一個巨大算式


       

      這還只是把現實世界的三維一點轉成二維像素座標的一點

 


    


     如果要把左邊那張拍歪的照片轉正就要先把二維的歪照片的點全部轉成
     三維空間再轉正成向右邊那張二維圖像

 

 



二、實作
  1.
公式

 

          不過有一個公式可以減少上面那些繁複的計算

 
          我們先把三維空間的點(x,y,z)與歪照片二維空間的點(u,v,1)之間的關係寫成

          下方這樣(p.s. 二維空間Z軸視為1)


           矩陣乘法


           關鍵在將xy座標同除z
           將z縮至1,直接把三維變二維
         
           係數再全部同除a33,這樣擁有八個未知數的這個方程式 x’ 及 y’ 解只需要四組原二維空間座標(u,v,1)就可以求出來一個轉換矩陣

 

 

 

  2. 導入OpenCV 找出四個點作透視變換



           這邊用的是畢氏定理,用輸入的四個點Point[ ]取傾斜的寬跟高



 

         

           再用剛剛取得的寬跟高去建立一個正方形的四個點
           得到targetPoint [ ]



 

           中間把一開始的四個點跟後來四個點轉成resultPoint2fsrcPoint2f這種格式後
           傳入getPerspectiveTransform可以拿回一個轉換矩陣
           最後就用warpPerspective套剛剛的轉換矩陣就可以得到最後結果

三、範例

 

 

 

 

 

 

 

 

 

 

王祥宇