Opencv3从头开始(十一)重映射&仿射变换

Opencv3从头开始(十一)重映射&仿射变换

  • 重映射
  • 仿射变换

重映射

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

重映射remap( )函数:

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

/*
重映射
*/

#include
#include
#include
#include
#include
#include

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 来获得旋转矩阵。

Opencv3从头开始(十一)重映射&仿射变换_第1张图片

/*
仿射变换
*/

#include
#include
#include
#include
#include
#include

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;

}

你可能感兴趣的:(Opencv)