- 操作系統:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
對圖像應用透視變換。
函數 warpPerspective 使用指定的矩陣對源圖像進行變換:
dst ( x , y ) = src ( M 11 x + M 12 y + M 13 M 31 x + M 32 y + M 33 , M 21 x + M 22 y + M 23 M 31 x + M 32 y + M 33 ) \texttt{dst} (x,y) = \texttt{src} \left ( \frac{M_{11} x + M_{12} y + M_{13}}{M_{31} x + M_{32} y + M_{33}} , \frac{M_{21} x + M_{22} y + M_{23}}{M_{31} x + M_{32} y + M_{33}} \right ) dst(x,y)=src(M31?x+M32?y+M33?M11?x+M12?y+M13??,M31?x+M32?y+M33?M21?x+M22?y+M23??)
否則,變換矩陣會先通過 invertAffineTransform 被求逆,然后才代入上面的公式中代替 M。
該函數不能在原地操作(in-place)。
函數原型
GMat cv::gapi::warpPerspective
(const GMat & src,const Mat & M,const Size & dsize,int flags = cv::INTER_LINEAR,int borderMode = cv::BORDER_CONSTANT,const Scalar & borderValue = Scalar()
)
參數
- 參數 src:輸入圖像。
- 參數 M:3×3 的變換矩陣。
- 參數 dsize:輸出圖像的尺寸(寬度,高度)。
- 參數flags:
插值方法的組合(可選 INTER_LINEAR 或 INTER_NEAREST);
可選標志 WARP_INVERSE_MAP,表示矩陣 M 是一個“逆變換”(即從目標圖像映射到源圖像,dst → src)。 - 參數 borderMode:像素外推方法(支持 BORDER_CONSTANT 或 BORDER_REPLICATE)。
- 參數borderValue:當邊界模式為常量填充時所使用的像素值;默認值為 0(黑色)。
代碼示例
#include <opencv2/opencv.hpp>
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/gapi/imgproc.hpp>using namespace cv;
using namespace cv::gapi;int main() {// 加載輸入圖像Mat src = imread("/media/dingxin/data/study/OpenCV/sources/images/Lenna.png");if (src.empty()) {std::cerr << "無法加載圖像!" << std::endl;return -1;}// 定義透視變換矩陣 MPoint2f src_pts[] = {Point2f(50, 50), Point2f(200, 50), Point2f(50, 200), Point2f(200, 200)};Point2f dst_pts[] = {Point2f(30, 30), Point2f(200, 20), Point2f(60, 180), Point2f(210, 190)};Mat M = getPerspectiveTransform(src_pts, dst_pts);// 定義輸出圖像尺寸Size new_size(src.cols, src.rows);// 定義 G-API 圖像處理圖(graph)GMat in; // 輸入節點// 應用透視變換GMat out = gapi::warpPerspective(in, M, new_size, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));// 構建 GComputationGComputation computation(in, out);// 執行計算Mat dst;computation.apply(src, dst);// 顯示結果imshow("原始圖像", src);imshow("透視變換后的圖像", dst);waitKey();return 0;
}