《OpenCV3编程入门》学习笔记7 图像变换(四 )仿射变换
7.4 仿射變換(Affine Transformation)
7.4.1 概念
1.仿射變換,放射映射,在幾何中,一個向量空間按進行一次線性變換(乘以一個矩陣)并接上一個平移(加上一個向量),變換為另一個向量空間的過程,保持了二維圖形的平直性和平行性。
2.變換形式:(1)旋轉(zhuǎn),rotation(2)平移,translation(3)縮放,scale
3.矩陣表示:
??????????
??使用矩陣A和矩陣B對二維向量X=[x;y]做變換:
????????????????????
??或
????????????????????
??即:
????????????????????
4.涉及函數(shù):warpAffine()和getRotationMatrix2D()函數(shù)
7.4.2 仿射變換函數(shù):warpAffine()函數(shù)
1.函數(shù)原型:
void warpAffine(InputArray src,OutputArray dst,InputArray M,Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
2.參數(shù)說明:
(1)輸入圖像
(2)輸出圖像
(3)2*3的變換矩陣M
(4)輸出圖像尺寸
(5)插值方式標(biāo)識符,默認INTER_LINEAR,可選插值方式:
??????????
(6)邊界像素模式,默認BORDER_CONSTANT
(7)在恒定邊界情況下取的值,默認Scalar(),即0
7.4.3 計算二維旋轉(zhuǎn)變換矩陣:getRotationMatrix2D()函數(shù)
1.函數(shù)原型:
void getRotationMatrix2D(Point2f center, double angle, double scale)
2.參數(shù)說明:
(1)源圖像旋轉(zhuǎn)中心
(2)旋轉(zhuǎn)角度
(3)縮放系數(shù)
3.函數(shù)操作:
??函數(shù)計算以下矩陣:
??????????????????
??其中,????????????
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 "【W(wǎng)arp后的圖像】"
#define WINDOW_NAME3 "【W(wǎng)arp和Rotate后的圖像】"int main()
{//參數(shù)準(zhǔn)備//定義兩組點,代表兩個三角形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;}//設(shè)置目標(biāo)圖像大小和類型dstImage_warp = Mat::zeros(srcImage.rows, srcImage.cols, srcImage.type());//設(shè)置源圖像與目標(biāo)圖像上的三組點以計算仿射變換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);//對原圖像應(yīng)用剛求得的仿射變換warpAffine(srcImage, dstImage_warp, warpMat, dstImage_warp.size());//對圖像進行縮放變換后再旋轉(zhuǎn)//計算圖像中點順時針旋轉(zhuǎn)50度縮放因子為0.6的矩陣Point center = Point(dstImage_warp.cols / 2, dstImage_warp.rows / 2);double angle = -50.0;double scale = 0.6;//通過上面的旋轉(zhuǎn)細節(jié)信息求得旋轉(zhuǎn)矩陣rotMat = getRotationMatrix2D(center, angle, scale);//旋轉(zhuǎn)已縮放的圖像warpAffine(dstImage_warp, dstImage_warp_rotate, rotMat, dstImage_warp.size());//顯示結(jié)果imshow(WINDOW_NAME1, srcImage);imshow(WINDOW_NAME2, dstImage_warp);imshow(WINDOW_NAME3, dstImage_warp_rotate);waitKey(0);return 0;
}
運行效果:
總結(jié)
以上是生活随笔為你收集整理的《OpenCV3编程入门》学习笔记7 图像变换(四 )仿射变换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 店面多少钱啊?
- 下一篇: 《OpenCV3编程入门》学习笔记7 图