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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D()

發布時間:2024/7/23 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D() 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

OpenCV學習筆記(十五):圖像仿射變換:warpAffine(),getRotationMatrix2D()

一個任意的仿射變換都能表示為乘以一個矩陣(線性變換)接著再加上一個向量(平移)的形式。
仿射變換(Affine Transformation或 Affine Map),是指在幾何中**一個向量空間進行一次線性變換并接上一個平移,變換為另一個向量空間的過程。**它保持了二維圖形的==“平直性”(即:直線經過變換之后依然是直線)和“平行性”==(即:二維圖形之間的相對位置關系保持不變,平行線依然是平行線,且直線上點的位置順序不變)。
那么, 我們能夠用仿射變換來表示如下三種常見的變換形式:

1)旋轉,rotation (線性變換)
2)平移,translation(向量加)
3)縮放,scale(線性變換)

1、warpAffine()函數

void warpAffine( InputArray src, // 源圖像 OutputArray dst, // 函數調用后的運算結果 InputArray M, // 2×3的變換矩陣 Size dsize, // 表示輸出圖像的尺寸 int flags=INTER_LINEAR, // 插值方法的標識符 intborderMode=BORDER_CONSTANT, // 邊界像素模式 const Scalar& borderValue=Scalar() // 在恒定的邊界情況下取的值 )

2、getAffineTransform()函數

計算3個二維點對之間的仿射變換矩陣H(2行x3列),自由度為6.

Mat cv::getAffineTransform( const Point2f src[], // 源圖像中三角形頂點的坐標(3點) const Point2f dst[] // 目標圖像中三角形頂點的坐標(3點) )


其中

2、getRotationMatrix2D()函數

Mat getRotationMatrix2D( Point2f center, // 表示源圖像的旋轉中心 double angle, // 旋轉角度。角度為正值表示向逆時針旋轉(坐標原點是左上角) double scale, // 縮放系數 )

此函數計算以下矩陣

1、示例一:

#include <opencv2/opencv.hpp>using namespace cv; using namespace std;#define WINDOW_NAME "重映射" //為窗口標題定義的宏Mat g_srcImage, g_dstImage; Mat g_map_x, g_map_y;int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);Mat src = imread("F:/C++/2. OPENCV 3.1.0/TEST/7.jpg");Mat dst_warp, dst_warpRotateScale;Point2f srcPoints[3];//原圖中的三點Point2f dstPoints[3];//目標圖中的三點//第一種仿射變換的調用方式:三點法//三個點對的值,只要知道變換后圖的三個點坐標,就可實現仿射變換srcPoints[0] = Point2f(0, 0);srcPoints[1] = Point2f(0, src.rows - 1);srcPoints[2] = Point2f(src.cols - 1, 0);//映射后的三個坐標值dstPoints[0] = Point2f(0, src.rows*0.3);dstPoints[1] = Point2f(src.cols*0.25, src.rows*0.75);dstPoints[2] = Point2f(src.cols*0.75, src.rows*0.25);Mat M1 = getAffineTransform(srcPoints, dstPoints);//計算變換矩陣cout<<"M1= "<<M1<<endl;warpAffine(src, dst_warp, M1, src.size());//仿射變換//第二種仿射變換的調用方式:直接指定角度和比例//旋轉加縮放Point2f center(src.cols/2, src.rows/2);//旋轉中心//Point2f center(0, 0);//旋轉中心double angle = 45;//逆時針旋轉45度double scale = 0.5;//縮放比例Mat M2 = getRotationMatrix2D(center, angle, scale);//計算旋轉加縮放的變換矩陣cout<<"M2= "<<M2<<endl;warpAffine(src, dst_warpRotateScale, M2, src.size());//仿射變換imshow("原始圖", src);imshow("仿射變換1", dst_warp);imshow("仿射變換2", dst_warpRotateScale);waitKey(0);return a.exec(); }



2、示例二,旋轉動畫:

#include <opencv2/opencv.hpp>using namespace cv; using namespace std;#define PIC_BEGIN_NUM 100 //這里定義你的起始圖片編號 #define ANGLE_START 0 //旋轉角度的開始 #define ANGLE_END 360 //旋轉角度的結束 #define ANGLE_STEP 1 //旋轉角度步長int main() {Mat srcImg = imread("F:/C++/2. OPENCV 3.1.0/TEST/7.jpg");imshow("source", srcImg);//char file[256]; // 文件寫出路徑//int count = PIC_BEGIN_NUM;Point center(srcImg.cols / 2, srcImg.rows / 2); //圖片中心為旋轉點namedWindow("warpAffine",1);// 循環顯示for (int tp = ANGLE_START; tp < ANGLE_END; tp += ANGLE_STEP){Mat tpimg;Mat rotMatS = getRotationMatrix2D(center, tp, 0.5); //圖片縮小到原來的0.5倍warpAffine(srcImg, tpimg, rotMatS, srcImg.size(), 1, 0, Scalar(0, 0, 0));//填充黑色背景imshow("warpAffine",tpimg);//sprintf(file, "F:/C++/2. OPENCV 3.1.0/TEST/%d.jpg", count++); //旋轉圖片以1.jpg 2.jpg 的名字格式保存//imwrite(file, tpimg);waitKey(30);}waitKey(0);return 0; }

總結

以上是生活随笔為你收集整理的OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D()的全部內容,希望文章能夠幫你解決所遇到的問題。

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