Opencv3從頭開始(十一)重映射&仿射變換

Opencv3從頭開始(十一)重映射&仿射變換

重映射

重映射,就是把一幅圖像中某位置的像素放置到另一個圖片指定位置的過程。

重映射remap( )函數:

C++: void remap(InputArray src, OutputArraydst, InputArray map1, InputArray map2, int interpolation, intborderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

在這裏插入圖片描述

/*
重映射
*/

#include<opencv2/opencv.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/imgcodecs.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>

using namespace std;
using namespace cv;

int main(int argc, char* argv[]){
    Mat image = imread("樹.jpg");
    //x/y重映射
    Mat map_x, map_y;
    Mat dstImage;

    map_x.create( image.size(), CV_32FC1 );
	map_y.create( image.size(), CV_32FC1 );

    //雙層循環,遍歷每一個像素點,改變map_x & map_y的值
	for( int j = 0; j < image.rows;j++)
	{ 
		for( int i = 0; i < image.cols;i++)
		{
			//改變map_x & map_y的值. 
			map_x.at<float>(j,i) = static_cast<float>(image.cols - i);
			map_y.at<float>(j,i) = static_cast<float>(image.rows - j);
		} 
	}
    //重映射
    remap( image, dstImage, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0,0, 0) );
    imshow("原圖",image);
    imshow("展示",dstImage);
    waitKey(0);
    return 0;

}

仿射變換

仿射變換(Affine Transformation或 Affine Map),又稱仿射映射,是指在幾何中,一個向量空間進行一次線性變換並接上一個平移,變換爲另一個向量空間的過程。它保持了二維圖形的“平直性”(即:直線經過變換之後依然是直線)和“平行性”(即:二維圖形之間的相對位置關係保持不變,平行線依然是平行線,且直線上點的位置順序不變)。

通常包括:
旋轉,rotation (線性變換)
平移,translation(向量加)
縮放,scale(線性變換)

warpAffine實現簡單的重映射。
getRotationMatrix2D 來獲得旋轉矩陣。

在這裏插入圖片描述

/*
仿射變換
*/

#include<opencv2/opencv.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/imgcodecs.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>

using namespace std;
using namespace cv;

int main(int argc, char* argv[]){
    Mat image = imread("樹.jpg");
    
    //定義兩組點,代表兩個三角形
	Point2f srcTriangle[3];
	Point2f dstTriangle[3];
	//定義一些Mat變量
	Mat rotMat( 2, 3, CV_32FC1 );
	Mat warpMat( 2, 3, CV_32FC1 );
	Mat dstImage_warp, dstImage_warp_rotate;

    //設置源圖像和目標圖像上的三組點以計算仿射變換
	srcTriangle[0] = Point2f( 0,0 );
	srcTriangle[1] = Point2f( static_cast<float>(image.cols - 1), 0 );
	srcTriangle[2] = Point2f( 0, static_cast<float>(image.rows - 1 ));
 
	dstTriangle[0] = Point2f( static_cast<float>(image.cols*0.0), static_cast<float>(image.rows*0.33));
	dstTriangle[1] = Point2f( static_cast<float>(image.cols*0.65), static_cast<float>(image.rows*0.35));
	dstTriangle[2] = Point2f( static_cast<float>(image.cols*0.15), static_cast<float>(image.rows*0.6));
    
    warpMat = getAffineTransform( srcTriangle, dstTriangle );
	//對源圖像應用剛剛求得的仿射變換
	warpAffine( image, dstImage_warp, warpMat, dstImage_warp.size() );

	//計算繞圖像中點順時針旋轉30度縮放因子爲0.8的旋轉矩陣
	Point center = Point( dstImage_warp.cols/2, dstImage_warp.rows/2 );
	double angle = -30.0;
	double scale = 0.8;
	//通過上面的旋轉細節信息求得旋轉矩陣
	rotMat = getRotationMatrix2D( center, angle, scale );
	//旋轉已縮放後的圖像
	warpAffine( dstImage_warp, dstImage_warp_rotate, rotMat, dstImage_warp.size() );

    imshow("原圖",image);
    imshow("展示_wrap",dstImage_warp);
    imshow("展示__warp_rotate",dstImage_warp_rotate);
    waitKey(0);
    return 0;

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章