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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

《OpenCV3编程入门》学习笔记7 图像变换(四 )仿射变换

發布時間:2023/11/27 生活经验 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《OpenCV3编程入门》学习笔记7 图像变换(四 )仿射变换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

7.4 仿射變換(Affine Transformation)

7.4.1 概念

1.仿射變換,放射映射,在幾何中,一個向量空間按進行一次線性變換(乘以一個矩陣)并接上一個平移(加上一個向量),變換為另一個向量空間的過程,保持了二維圖形的平直性和平行性。
2.變換形式:(1)旋轉,rotation(2)平移,translation(3)縮放,scale
3.矩陣表示:
??????????
??使用矩陣A和矩陣B對二維向量X=[x;y]做變換:
????????????????????
??或
????????????????????
??即:
????????????????????
4.涉及函數:warpAffine()和getRotationMatrix2D()函數

7.4.2 仿射變換函數:warpAffine()函數

1.函數原型:

void warpAffine(InputArray src,OutputArray dst,InputArray M,Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

2.參數說明:
(1)輸入圖像
(2)輸出圖像
(3)2*3的變換矩陣M
(4)輸出圖像尺寸
(5)插值方式標識符,默認INTER_LINEAR,可選插值方式:
??????????
(6)邊界像素模式,默認BORDER_CONSTANT
(7)在恒定邊界情況下取的值,默認Scalar(),即0

7.4.3 計算二維旋轉變換矩陣:getRotationMatrix2D()函數

1.函數原型:

void getRotationMatrix2D(Point2f center, double angle, double scale)

2.參數說明:
(1)源圖像旋轉中心
(2)旋轉角度
(3)縮放系數
3.函數操作:
??函數計算以下矩陣:
??????????????????
??其中,????????????

7.4.4 仿射變換示例

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
#define WINDOW_NAME1 "【原始圖】"
#define WINDOW_NAME2 "【Warp后的圖像】"
#define WINDOW_NAME3 "【Warp和Rotate后的圖像】"int main()
{//參數準備//定義兩組點,代表兩個三角形Point2f srcTriangle[3];Point2f dstTriangle[3];//定義一些Mat變量Mat rotMat(2, 3, CV_32FC1);Mat warpMat(2, 3, CV_32FC1);Mat srcImage, dstImage_warp, dstImage_warp_rotate;//加載原圖并初始化srcImage = imread("love.jpg");if (!srcImage.data){printf("載入原圖失敗~!\n");return false;}//設置目標圖像大小和類型dstImage_warp = Mat::zeros(srcImage.rows, srcImage.cols, srcImage.type());//設置源圖像與目標圖像上的三組點以計算仿射變換srcTriangle[0] = Point2f(0, 0);srcTriangle[1] = Point2f(static_cast<float>(srcImage.cols - 1), 0);srcTriangle[2] = Point2f(0, static_cast<float>(srcImage.rows - 1));dstTriangle[0] = Point2f(static_cast<float>(srcImage.cols*0.0), static_cast<float>(srcImage.rows*0.33));dstTriangle[1] = Point2f(static_cast<float>(srcImage.cols*0.65), static_cast<float>(srcImage.rows*0.35));dstTriangle[2] = Point2f(static_cast<float>(srcImage.cols*0.15), static_cast<float>(srcImage.rows*0.6));//仿射變換warpMat = getAffineTransform(srcTriangle, dstTriangle);//對原圖像應用剛求得的仿射變換warpAffine(srcImage, dstImage_warp, warpMat, dstImage_warp.size());//對圖像進行縮放變換后再旋轉//計算圖像中點順時針旋轉50度縮放因子為0.6的矩陣Point center = Point(dstImage_warp.cols / 2, dstImage_warp.rows / 2);double angle = -50.0;double scale = 0.6;//通過上面的旋轉細節信息求得旋轉矩陣rotMat = getRotationMatrix2D(center, angle, scale);//旋轉已縮放的圖像warpAffine(dstImage_warp, dstImage_warp_rotate, rotMat, dstImage_warp.size());//顯示結果imshow(WINDOW_NAME1, srcImage);imshow(WINDOW_NAME2, dstImage_warp);imshow(WINDOW_NAME3, dstImage_warp_rotate);waitKey(0);return 0;
}

運行效果:

總結

以上是生活随笔為你收集整理的《OpenCV3编程入门》学习笔记7 图像变换(四 )仿射变换的全部內容,希望文章能夠幫你解決所遇到的問題。

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