簡體   English   中英

OpenCV、Python:在拼接圖像時消除最終變窄

[英]OpenCV, Python: Eliminating eventual narrowing when stitching images

很大程度上要感謝有關 stackoverflow 的一些出色答案( 此處此處此處),我在對齊圖像方面取得了一些不錯的成功。 但是,有一個問題,如下所示。 當我將許多圖像拼接在一起時,它們變得越來越小。

我關於為什么會這樣的理論是相機並不完全垂直於地面,所以隨着我添加越來越多的圖像,相機不垂直於地面的自然視角導致遠圖像變得更小。 不過,這很可能是完全不正確的。

然而,即使當我轉換第一張圖像使其“好像”垂直於地面拍攝時(我認為),失真仍然發生。

出色的 stackoverflow 社區是否對我如何補救這種情況有任何想法?

這是我用來拼接圖像的過程:

  1. 使用圖像的角緯度/經度點的知識,扭曲使第一幅圖像垂直於地面。 我用來做這個的單應性是“基礎”單應性
  2. 使用goodFeaturesToTrack()calcOpticalFlowPyrLK()查找每張圖像和最后一張圖像之間的共同特征
  3. 使用findHomography()查找兩個圖像之間的單應性。 然后,將該單應性與所有先前的單應性組合以得到“凈”單應性
  4. 應用轉換並用我到目前為止所做的最終結果覆蓋圖像。

有一個主要限制

隨着相機的移動,馬賽克必須一次構建一張圖像。 我正在嘗試在無人機飛行時創建實時地圖,將每張圖像與最后一張一張一張地擬合。

在此處輸入圖片說明

我關於為什么會發生這種情況的理論是相機並不完全垂直於地面。

這是一個很好的直覺。 如果相機是有角度的,那么當它移向一個物體時,該物體在畫面中會變大。 因此,如果您將其拼接到前一幀,則當前幀需要縮小以適應前一幀中的對象。

完整的3x3單應性包括xy方向的失真,但2x3仿射變換不包括。 為了堅持您當前的管道,您可以嘗試找到仿射或歐幾里得(剛性)變換。 它們之間的區別在於仿射扭曲允許在xy方向分別進行剪切和拉伸,歐幾里德變換僅進行平移、旋轉和均勻縮放。 兩者都保留平行線,而完整的單應性則不保留,因此您最終可能會得到一個方形圖像變得更加梯形,並且重復這樣做會縮小您的圖像。 仿射扭曲仍然可以僅在一個方向上收縮,將正方形變成矩形,因此它仍然可能會收縮。 歐幾里得變換只能縮放整個正方形,所以它仍然可能縮小。

當然,它們也不會像findHomography那樣完美匹配,但它們應該能夠讓您關閉匹配而不會過多地扭曲大小。 有兩個選項可以使用 OpenCV 找到歐幾里得或仿射變換:

  1. estimateRigidTransform()而不是warpPerspective()來獲得參數fullAffine=False的剛性扭曲或fullAffine=True的仿射扭曲。

  2. findTransformECC()與可選參數motionType=cv2.MOTION_EUCLIDEANmotionType=cv2.MOTION_AFFINE (但仿射是默認值,因此無需指定)。

您可以在他們的文檔頁面上查看算法之間的差異,或者嘗試兩者以查看最適合您的算法。

如果這也不起作用,您可以嘗試估計使框架完全垂直於地面的單應性。 如果你這樣做,你可以試試它適用於所有的幀,然后匹配的圖像。 否則,您可能想要轉向更高級的方法,而不僅僅是在每幀之間找到單應性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM