0
点赞
收藏
分享

微信扫一扫

Qt+OpenCV联合开发(二十一)--图像翻转与旋转

一、简述仿射变换

一个任意的仿射变换都能表示为 乘以一个矩阵 (线性变换) 接着再加上一个向量 (平移),变换为另一个向量空间的过程。我们能够用仿射变换来表示翻转、旋转 (线性变换),平移 (向量加),缩放操作 (线性变换)等,其实, 仿射变换代表的是两幅图之间的关系 

我们通常使用 2 x 3矩阵来表示仿射变换

 

考虑到我们要使用矩阵 A 和B对二维向量  做变换, 所以也能表示为下列形式:

 

 

以上仿射变换看不懂没关系,接着往下看 

二、函数原型

1、flip函数

2、warpAffine函数

3、getRotationMatrix2D函数

三、实现效果 

1、flip函数实现翻转

原图

三种翻转后的效果,翻转模式分别对应 0 1 2

 2、warpAffine实现仿射变换

2.1背景默认为黑色

 2.2更换背景

 2.3基于旋转测算出旋转后真正的大小

四、代码

1、flip函数实现翻转

void test1::flip_demo(Mat &image)
{
    Mat dst;
    flip(image,dst,0);//左右
    imshow("flipCode0 to image",dst);
    flip(image,dst,1);//上下
    imshow("flipCode1 to image",dst);
    flip(image,dst,-1);//180度旋转
    imshow("flipCode-1 to image",dst);

}

  2、warpAffine实现仿射变换

void test1::rotate_demo(Mat &image)
{
    Mat dst,M;
    int w = image.cols;
    int h = image.rows;
    M = getRotationMatrix2D(Point2f(w/2,h/2),45,1.0);//第一个参数为旋转中心
    double cos = abs(M.at<double>(0,0));//0,0为矩阵中的cos
    double sin = abs(M.at<double>(0,1));//0,1为矩阵中的sin
    //计算旋转后新的宽高
    int nw = cos * w + sin * h;
    int nh = sin * w + cos * h;
    //M.at<double>(0, 2) 为M矩阵第一行最后一列的值,即新的宽度减去原来的宽度的差值
    M.at<double>(0, 2) += (nw / 2 - w / 2);
    //计算M矩阵第二行最后一列的值
    M.at<double>(1, 2) += (nh / 2 - h / 2);
    //参数1原来图像的中心位置。参数2角度是多少。参数3是图像本身大小的放大缩小
//    warpAffine(image,dst,M,image.size(),INTER_LINEAR,0,Scalar(147,112,219));//203,192,255
    //新的图像:测算出旋转后真正的大小
    warpAffine(image,dst,M,Size(nw,nh),INTER_LINEAR,0,Scalar(147,112,219));
    imshow("rotate_image",dst);
}

举报

相关推荐

0 条评论