重映射,就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。
重映射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 来获得旋转矩阵。
/*
仿射变换
*/
#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;
}