OpenCV,計算兩幅映像的單應矩陣

來源:互聯網
上載者:User

標籤:

平面射影變換是關於其次3維向量的一種線性變換,可以使用一個非奇異的$3 \times 3$矩陣H表示,$X‘ = HX$,射影變換也叫做單應(Homography)。計算出兩幅映像之間的單應矩陣H,那麼應用這個關係可以將一個視圖中的

所有點變換到另一個視圖中。

,最右邊映像是將最左邊映像進行了一次射影變換,變換到中間映像視圖後的映像。

使用OpenCV可以調用庫函數findHomography計算兩幅映像的單應矩陣,其聲明如下

Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray() )

單應矩陣的計算需要兩幅映像中相對應的點,srcPoints,dstPoints是兩幅映像中相對應的點,可以是Vector<Point2f>或者是CV_32FC2類型的矩陣,Method是計算單應矩陣時所使用的方法。

得到了映像的單應矩陣H就可以使用函數warpPerspective將映像變換到另一個視圖中

void warpPerspective(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

下面就使用上面提到的兩個函數,計算出兩幅映像之間的單應矩陣H,並且將兩幅映像合并為一副映像。

其操作過程非常簡單,

  • 在“大”映像(靶心圖表像)上選擇4個點和“小”映像(被合并映像)的四角做對應,然後根據這4對對應的點計算兩幅映像的單應矩陣。
  • 得到單應矩陣H後,利用函數warpPerspective將H應用到“小”映像上,得到映像M
  • 將映像M合并到靶心圖表像中選擇的四個點的位置
實現

首先定義兩個vector儲存對應的4對點

//4對相對應的像點計算映像的單應 Homographyvector<Point2f> left_image;vector<Point2f> right_image;

將小映像的四角座標插入到left_image中

left_image.push_back(Point2f(0, 0));    left_image.push_back(Point2f(0, image_logo.rows));    left_image.push_back(Point2f(image_logo.cols, image_logo.rows));    left_image.push_back(Point2f(image_logo.cols, 0));

在在大圖中選擇4個點,並用這4對相對應的點計算單應矩陣H

if (e == EVENT_LBUTTONDOWN){        if (right_image.size() < 4){            right_image.push_back(Point2f(float(x), float(y)));            cout << x << " " << y << endl;        }        else {            cout << "Calculating Homography" << endl;            setMouseCallback("Display window", nullptr, nullptr);            Mat H = findHomography(left_image, right_image, 0);            Mat logoWarped;            warpPerspective(image_logo, logoWarped,H, image_main.size());            showFinal(image_main, logoWarped);        }    }

最後,將logoWarped和main映像相加就得到最後結果。

詳細代碼:https://github.com/brookicv/opencvSample/tree/master/Homography

OpenCV,計算兩幅映像的單應矩陣

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.