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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

getRotationMatrix2D函数

發布時間:2025/4/16 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 getRotationMatrix2D函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

getRotationMatrix2D函數

主要用于獲得圖像繞著 某一點的旋轉矩陣?
函數調用形式: Mat?getRotationMatrix2D(Point2f?center, double?angle, double?scale)

參數詳解:
Point2f?center:表示旋轉的中心點
double?angle:表示旋轉的角度
double?scale:圖像縮放因子


opencv代碼: #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h>using namespace cv; using namespace std;/// 全局變量 char* source_window = "Source image"; char* warp_window = "Warp"; char* warp_rotate_window = "Warp + Rotate";/** @function main */int main( int argc, char** argv ){Point2f srcTri[3];Point2f dstTri[3];Mat rot_mat( 2, 3, CV_32FC1 );Mat warp_mat( 2, 3, CV_32FC1 );Mat src, warp_dst, warp_rotate_dst;/// 加載源圖像src = imread( argv[1], 1 );/// 設置目標圖像的大小和類型與源圖像一致warp_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 );dstTri[0] = Point2f( src.cols*0.0, src.rows*0.33 );dstTri[1] = Point2f( src.cols*0.85, src.rows*0.25 );dstTri[2] = Point2f( src.cols*0.15, src.rows*0.7 );/// 求得仿射變換warp_mat = getAffineTransform( srcTri, dstTri );/// 對源圖像應用上面求得的仿射變換warpAffine( src, warp_dst, warp_mat, warp_dst.size() );/** 對圖像扭曲后再旋轉 *//// 計算繞圖像中點順時針旋轉50度縮放因子為0.6的旋轉矩陣Point center = Point( warp_dst.cols/2, warp_dst.rows/2 );double angle = -50.0;double scale = 0.6;/// 通過上面的旋轉細節信息求得旋轉矩陣rot_mat = getRotationMatrix2D( center, angle, scale );/// 旋轉已扭曲圖像warpAffine( warp_dst, warp_rotate_dst, rot_mat, warp_dst.size() );/// 顯示結果namedWindow( source_window, CV_WINDOW_AUTOSIZE );imshow( source_window, src );namedWindow( warp_window, CV_WINDOW_AUTOSIZE );imshow( warp_window, warp_dst );namedWindow( warp_rotate_window, CV_WINDOW_AUTOSIZE );imshow( warp_rotate_window, warp_rotate_dst );/// 等待用戶按任意按鍵退出程序waitKey(0);return 0;}

說明

  • 定義一些需要用到的變量, 比如需要用來儲存中間和目標圖像的Mat和兩個需要用來定義仿射變換的二維點數組.

    Point2f srcTri[3]; Point2f dstTri[3];Mat rot_mat( 2, 3, CV_32FC1 ); Mat warp_mat( 2, 3, CV_32FC1 ); Mat src, warp_dst, warp_rotate_dst;
  • 加載源圖像:

    src = imread( argv[1], 1 );
  • 以與源圖像同樣的類型和大小來對目標圖像初始化:

    warp_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 );dstTri[0] = Point2f( src.cols*0.0, src.rows*0.33 ); dstTri[1] = Point2f( src.cols*0.85, src.rows*0.25 ); dstTri[2] = Point2f( src.cols*0.15, src.rows*0.7 );

    你可能想把這些點繪出來以獲得對變換的更直觀感受. 他們的位置大概就是在上面圖例中的點的位置 (原理部分). 你會注意到由三點定義的三角形的大小和方向改變了.

  • 通過這兩組點, 我們能夠使用OpenCV函數?getAffineTransform?來求出仿射變換:

    warp_mat = getAffineTransform( srcTri, dstTri );

    我們獲得了用以描述仿射變換的??矩陣 (在這里是?warp_mat)

  • 將剛剛求得的仿射變換應用到源圖像

    warpAffine( src, warp_dst, warp_mat, warp_dst.size() );

    函數有以下參數:

    • src: 輸入源圖像
    • warp_dst: 輸出圖像
    • warp_mat: 仿射變換矩陣
    • warp_dst.size(): 輸出圖像的尺寸

    這樣我們就獲得了變換后的圖像! 我們將會把它顯示出來. 在此之前, 我們還想要旋轉它...

  • 旋轉:?想要旋轉一幅圖像, 你需要兩個參數:

  • 旋轉圖像所要圍繞的中心
  • 旋轉的角度. 在OpenCV中正角度是逆時針的
  • 可選擇:?縮放因子
  • 我們通過下面的代碼來定義這些參數:

    Point center = Point( warp_dst.cols/2, warp_dst.rows/2 ); double angle = -50.0; double scale = 0.6;
  • 我們利用OpenCV函數?getRotationMatrix2D?來獲得旋轉矩陣, 這個函數返回一個??矩陣 (這里是?rot_mat)

    rot_mat = getRotationMatrix2D( center, angle, scale );
  • 現在把旋轉應用到仿射變換的輸出.

    warpAffine( warp_dst, warp_rotate_dst, rot_mat, warp_dst.size() );
  • 最后我們把仿射變換和旋轉的結果繪制在窗體中,源圖像也繪制出來以作參照:

    namedWindow( source_window, CV_WINDOW_AUTOSIZE ); imshow( source_window, src );namedWindow( warp_window, CV_WINDOW_AUTOSIZE ); imshow( warp_window, warp_dst );namedWindow( warp_rotate_window, CV_WINDOW_AUTOSIZE ); imshow( warp_rotate_window, warp_rotate_dst );
  • 等待用戶退出程序

    waitKey(0);
  • 結果

  • 編譯上述例程之后, 我們給出一個圖像的路徑作為參數. 比如這樣一幅圖片:

    仿射變換后我們獲得:

    最后, 應用了一個負角度旋轉 (記住負角度指的是順時針) 和基于一個縮放因子的縮放之后, 我們得到:



  • 總結

    以上是生活随笔為你收集整理的getRotationMatrix2D函数的全部內容,希望文章能夠幫你解決所遇到的問題。

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