日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【OpenCV3】透视变换——cv::getPerspectiveTransform()与cv::warpPerspective()详解

發(fā)布時間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【OpenCV3】透视变换——cv::getPerspectiveTransform()与cv::warpPerspective()详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

透視變換(Perspective Transformation)是將成像投影到一個新的視平面(Viewing Plane),也稱作投影映射(Projective Mapping)。如圖1,通過透視變換ABC變換到A'B'C'。


圖1 透視變換示意圖

透視變換的通用公式為:


變換后的坐標x,y分別為:。

展開之后即:


其中,稱為透視變換矩陣:表示線性變換,如scaling,shearing和ratotion等;

用于平移,因此此前介紹的仿射變換可以視作一種特殊的透視變換。

如圖2,我們想將傾斜視角拍攝到的道路圖像轉換成鳥瞰圖,即將攝像機的視角轉換到和道路平行。


圖2 傾斜視角


首先,我們需要獲得此次透視變換的變換矩陣,opencv2和opencv3中用于計算透視變換矩陣的函數是cv::getPerspectiveTransform(),C++接口其調用形式如下:

cv::Mat cv::getPerspectiveTransform( // 返回3x3透視變換矩陣const cv::Point2f* src, // 源圖像四個頂點坐標(點數組)const cv::Point2f* dst // 目標圖像上四個頂點的坐標(點數組));

如圖3 ,我們選取道路上的兩條平行分界線上的四個點A(165, 270)、C(360, 125)、D(615, 125)、B(835, 270),對應于鳥瞰圖上的點則分別為A(165, 270)、C'(165, 30)、D'(835, 30)、B(835, 270)。


圖3 透視變換端點

通過這四對點我們即可計算出透視變換矩陣M。

C++代碼如下:

cv::Mat get_perspective_mat() {cv::Point2f src_points[] = { cv::Point2f(165, 270),cv::Point2f(835, 270),cv::Point2f(360, 125),cv::Point2f(615, 125) };cv::Point2f dst_points[] = {cv::Point2f(165, 270),cv::Point2f(835, 270),cv::Point2f(165, 30),cv::Point2f(835, 30) };cv::Mat M = cv::getPerspectiveTransform(src_points, dst_points);return M;}

Python代碼如下:

def get_perspective_mat():src_points = np.array([[165., 270.], [835., 270.], [360., 125.], [615., 125.]], dtype = "float32")dst_points = np.array([[165., 270.], [835., 270.], [165., 30.], [835., 30.]], dtype = "float32")M = cv2.getPerspectiveTransform(src_points, dst_points)return M

計算結果如下:


在獲得透視變換矩陣后,即可使用與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() //常量邊界時使用);

C++代碼如下:

cv::Mat perspective;cv::warpPerspective(image, perspective, M, cv::Size(960, 270), cv::INTER_LINEAR);


Python代碼如下:

perspective = cv2.warpPerspective(image, M, (960, 270), cv2.INTER_LINEAR)

變換結果如下:



2017.05.19


總結

以上是生活随笔為你收集整理的【OpenCV3】透视变换——cv::getPerspectiveTransform()与cv::warpPerspective()详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。