OpenCV 透视变换 图像拼接
?A:OpenCV 透視變換
一:OpenCV透視變換的概念
仿射變換(affine transform)與透視變換(perspective transform)在圖像還原、圖像局部變化處理方面有重要意義。通常,在2D平面中,仿射變換的應用較多,而在3D平面中,透視變換又有了自己的一席之地。兩種變換原理相似,結果也類似,可針對不同的場合使用適當的變換。
仿射變換和透視變換的數學原理不需深究,在應用層面,仿射變換是圖像基于3個固定頂點的變換,如下圖所示:
二:透視變換工作原理
透視變換(Perspective Transformation)的本質是將圖像投影到一個新的視平面,其通用變換公式為:
(u,v)為原始圖像像素坐標,(x=x’/w’,y=y’/w’)為變換之后的圖像像素坐標。透視變換矩陣圖解如下:
透視變換工作原理
仿射變換(Affine Transformation)可以理解為透視變換的特殊形式。透視變換的數學表達式為:
所以,給定透視變換對應的四對像素點坐標,即可求得透視變換矩陣;反之,給定透視變換矩陣,即可對圖像或像素點坐標完成透視變換,如下圖所示:
三:findHomography函數
這里重點分析findHomography函數參數和使用方法
findHomography: 計算多個二維點對之間的最優單映射變換矩陣 H(3行x3列) ,使用最小均方誤差或者RANSAC方法。函數功能:找到兩個平面之間的變換矩陣。
Mat cv::findHomography ( InputArray srcPoints,InputArray dstPoints,int method = 0,double ransacReprojThreshold = 3,OutputArray mask = noArray(),const int maxIters = 2000,const double confidence = 0.995 )四:warpPerspective函數
void warpPerspective(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())warpPerspective參數說明:
1.src – 輸入圖像 2.dst – 大小為dsize且類型與src相同的輸出圖像 3.M – 3×3變換矩陣 4.dsize – 輸出圖像的大小圖中紅點即為固定頂點,在變換先后固定頂點的像素值不變,圖像整體則根據變換規則進行變換
同理,透視變換是圖像基于4個固定頂點的變換,如圖所示:
五:透視變換案例
這個例子中通過鼠標點擊圖片進行區域讀取
六:getPerspectiveTransform函數
C++方式一:Mat getPerspectiveTransform(InputArray src, InputArray dst)
C++方式二:Mat getPerspectiveTransform(const Point2f src[], const Point2f dst[])
getPerspectiveTransform參數說明:
??? src – 源圖像中四邊形頂點的坐標
??? dst – 目標圖像中相應四邊形頂點的坐標。
該函數計算透視變換的3乘3矩陣,以便實現以下計算:
代碼示例:
int main( ) { Point2f srcTri[4]; Point2f dstTri[4];Mat warpPerspective_mat( 3, 3, CV_32FC1 ); Mat src, warpPerspective_dst;/// Load the image src = imread( "lena.bmp", IMREAD_COLOR );/// Set the dst image the same type and size as src warpPerspective_dst = Mat::zeros( src.rows, src.cols, src.type() );/// 設置三組點,求出變換矩陣 srcTri[0] = Point2f( 0,0 ); srcTri[1] = Point2f( src.cols - 1,0 ); srcTri[2] = Point2f( 0,src.rows - 1); srcTri[3] = Point2f(src.cols - 1,src.rows - 1);dstTri[0] = Point2f( 0,src.rows*0.13 );dstTri[1] = Point2f( src.cols*0.9,0 );dstTri[2] = Point2f( src.cols*0.2,src.rows*0.7 );dstTri[3] = Point2f( src.cols*0.8,src.rows );//計算3個二維點對之間的仿射變換矩陣(2行x3列)warpPerspective_mat = getPerspectiveTransform( srcTri, dstTri );//應用仿射變換,可以恢復出原圖warpPerspective( src, warpPerspective_dst, warpPerspective_mat, src.size() );//顯示結果namedWindow( source_window, WINDOW_AUTOSIZE );imshow( source_window, src );namedWindow( warpPerspective_window, WINDOW_AUTOSIZE );imshow( warpPerspective_window, warpPerspective_dst );/// 等待,直到用戶退出waitKey(0);return 0; }B:OpenCV 圖像拼接
一:OpenCV圖像特征采集
特征提取:
? 一幅圖中總存在著一些獨特的像素點,這些點我們可以認為就是這幅圖的特征,成為特征點。
計算機視覺領域特征提取:
獲取一幅圖中存在著一些獨特的像素點。
解決兩個問題:
????? 1、提取圖片中的特征點
????? 2、解決尺度不變性問題,不同大小的圖片獲取到的特征是一樣的。
????? 3、提取到的特征點要穩定,能被精確定位。
?
二:特征提取算法
三:特征提取
提取到的特征很粗糙,不是很精確的特征點,導致效果很差。
去粗取精,獲取優秀的匹配點。
四:特征取精
取一幅圖像中的一個SIFT關鍵點,并找出其與另一幅圖像中歐式距離最近的前兩個關鍵點,在這兩個關鍵點中,如果最近的距離除以次近的距離得到的比率ratio少于某個閾值T,則接受這一對匹配點。
五:OpenCV透視轉換
透視變換是按照物體成像投影規律進行變換,即將物體重新投影到新的成像平面。透視變換常用于機器人視覺導航研究中,由于相機視場與地面存在傾斜角使得物體成像產生畸變,通常通過透視變換實現對物體圖像的校正。
六:透視矩陣
[u,v,w] 表示當前平面坐標的x,y,z,如果是平面,那么z=1。
[x',y',z'] 表示目標平面坐標的x,y,z,如果是平面,那么z=1。
通過以上公式,我們可以將透視矩陣理解為:透視矩陣是原始平面可目標平面之間的一種轉換關系。
七:獲取特征矩陣
根據圖像的4個頂點來獲取特征矩陣
cv::Mat cv::getPerspectiveTransform( // 返回3x3透視變換矩陣const cv::Point2f* src, // 源圖像四個頂點坐標(點數組)const cv::Point2f* dst // 目標圖像上四個頂點的坐標(點數組));函數來計算透視矩陣H(3*3)
findHomography??? (???InputArray???? srcPoints,//源平面中點的坐標矩陣.vector<Point2f>類型InputArray???? dstPoints,//目標平面中點的坐標矩陣,vector<Point2f>類型int???? method = 0,double???? ransacReprojThreshold = 3,OutputArray???? mask = noArray(),const int???? maxIters = 2000,const double???? confidence = 0.995)使用cv::warpPerspective()進行透視變換
void cv::warpPerspective(cv::InputArray src, // 輸入圖像cv::OutputArray dst, // 輸出圖像cv::InputArray M, // 3x3 變換矩陣cv::Size dsize, // 目標圖像大小int flags = cv::INTER_LINEAR, // 插值方法int borderMode = cv::BORDER_CONSTANT, // 外推方法const cv::Scalar& borderValue = cv::Scalar() //常量邊界時使用);八:圖像拷貝
圖像拷貝:將一副圖像拷貝到另一副圖像上的過程:
九:圖片拼接流程思想?
總結
以上是生活随笔為你收集整理的OpenCV 透视变换 图像拼接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css 灰度_如何在滚动上建立灰度到色彩
- 下一篇: 仿智联招聘实现简历导出功能