對圖像的仿射變換
阿新 • • 發佈:2018-06-05
控制 lan 換來 存儲 input 順序存儲 矩陣 bubuko war
仿射變換,又稱仿射映射,是指在幾何中,一個向量空間進行一次線性變換並接上一個平移,變換為另一個向量空間
線性變換包含了平移,縮放,旋轉,鏡像,斜切,正交投影,線性變換在幾何上可能造成拉伸但是不會直線不會出現彎折。
在OpenCV裏仿射變換通過一個2x3的矩陣來表示,前面兩列表示旋轉、縮放、斜切、鏡像等,後面兩列表示x,y方向平移
下面我們來通過仿射變換來實現圖像的平移、縮放、旋轉
平移:(向X軸方向平移100像素)
只平移的話,前面兩列單位矩陣,後面一列數據(100,0)
縮放:(x軸縮放0.3,y軸縮放0.5)
旋轉:(順時針旋轉30度)
代碼如下:
// wrapaffine.cpp: 定義控制臺應用程序的入口點。 // #include "stdafx.h" #include "opencv2/opencv.hpp" // 顯示平移 void showTranslate(cv::Mat&inputImage) { cv::Mat mat1 = (cv::Mat_<double>(2, 3) << 1, 0, 100, 0, 1, 0); cv::Mat destImg; cv::warpAffine(inputImage, destImg, mat1, cv::Size(inputImage.cols, inputImage.rows), cv::INTER_LINEAR, cv::BORDER_CONSTANT); cv::imshow("translate", destImg); } void showScale(cv::Mat&inputImage) { cv::Mat mat1 = (cv::Mat_<double>(2, 3) << 0.3, 0, 0, 0, 0.5, 0); cv::Mat destImg; cv::warpAffine(inputImage, destImg, mat1, cv::Size(inputImage.cols, inputImage.rows), cv::INTER_LINEAR, cv::BORDER_CONSTANT); cv::imshow("scale", destImg); } void showRotate(cv::Mat&inputImage) { float g3 = sqrt(3.0);// 根號3 cv::Mat mat1 = (cv::Mat_<double>(2, 3) << g3/2.0, -1.0/2.0, 0, 1.0 / 2.0, g3 / 2.0, 0); cv::Mat destImg; cv::warpAffine(inputImage, destImg, mat1, cv::Size(inputImage.cols, inputImage.rows), cv::INTER_LINEAR, cv::BORDER_CONSTANT); cv::imshow("rotate", destImg); } int main() { cv::Mat inputImage = cv::imread("test.png"); cv::imshow("src", inputImage); showTranslate(inputImage); showScale(inputImage); showRotate(inputImage); cv::waitKey(); cv::destroyAllWindows(); return 0; }
註:OpenCV的cv::Mat是按行的順序存儲數據,意思就是這樣一個縮放矩陣他的數據從上面一行0.3,0,0開始存儲到第二行0,0.5,0來按順序存放
對圖像的仿射變換