Mat src,rotate_dst;
char* source_window = "Source image";
char* rotate_window = "Rotate";
int main( int argc, char** argv )
{
Point2f srcTri[3];
Point2f dstTri[3];
//定义一个2行3列的矩阵
Mat rot_mat( 2, 3, CV_32FC1 );
/// 加载源图像
src = imread( argv[1], 1 );
/// 设置目标图像的大小和类型与源图像一致
rotate_dst = Mat::zeros( src.rows, src.cols, src.type() );
/// 设置源图像和目标图像上的三组点以计算仿射变换
srcTri[0] = Point2f( 0,0 );
srcTri[1] = Point2f( src.cols - 1, 0 );
srcTri[2] = Point2f( 0, src.rows - 1 );
dstTri[0] = Point2f( src.cols*0.0, src.rows*0.33 );
dstTri[1] = Point2f( src.cols*0.85, src.rows*0.25 );
dstTri[2] = Point2f( src.cols*0.15, src.rows*0.7 );
/// 求得仿射变换
rot_mat = getAffineTransform( srcTri, dstTri );
/// 对源图像应用上面求得的仿射变换
warpAffine( src, rotate_dst, rot_mat, rotate_dst.size() );
double scale = 0.6;
double angle = 80;
/// 计算绕图像中点顺时针旋转80度缩放因子为0.6的旋转矩阵
Point center = Point( rotate_dst.cols/2, rotate_dst.rows/2 );
/// 通过上面的旋转细节信息求得旋转矩阵
rot_mat = getRotationMatrix2D( center, angle, scale );
warpAffine( src, rotate_dst, rot_mat, rotate_dst.size() );
/// 显示结果
imshow( source_window, src );
imshow( rotate_window, rotate_dst );
/// 等待用户按任意按键退出程序
//waitKey(0);
利用opencv实现仿射变换一般会涉及到warpAffine和getRotationMatrix2D两个函数,其中warpAffine可以实现通过相应矩阵变换后的图片,getRotationMatrix2D可以获得旋转矩阵,将矩阵应用于 warpAffine
warpAffine函数:
void cv::warpAffine
( InputArray src,
OutputArray dst,
InputArray M,
Size dsize,
int flags = INTER_LINEAR,
int borderMode = BORDER_CONSTANT,
const Scalar & borderValue = Scalar()
)
. src: 输入图像
. dst: 输出图像,尺寸由dsize指定,图像类型与原图像一致
. M: 2X3的变换矩阵
. dsize: 指定图像输出尺寸
. flags: 插值算法标识符,有默认值INTER_LINEAR,