opencv图像基本操作-上下左右平移-放大-缩小-旋转-还原

初步编程 专栏收录该内容
89 篇文章 0 订阅

按键完成相应的操作按键完成
注意需要在图片上面按键盘才有反应

#include <iostream>
#include<opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

Mat  pingyi(Mat src,int detal_x,int detal_y)
{
    Mat dst;
    cv::Size dst_sz = src.size();
    //定义平移矩阵
    cv::Mat t_mat =cv::Mat::zeros(2, 3, CV_32FC1);
    t_mat.at<float>(0, 0) = 1;
    t_mat.at<float>(0, 2) = detal_x; //水平平移量
    t_mat.at<float>(1, 1) = 1;
    t_mat.at<float>(1, 2) = detal_y; //竖直平移量
    //根据平移矩阵进行仿射变换
    cv::warpAffine(src, dst, t_mat, dst_sz);
    return dst;
}

//rotateImg
cv::Mat rotateImg_(cv::Mat & img, int degree)
{
    if (degree == 0)
    {
        cv::Mat m = img.clone();
        return m;
    }
    degree = -degree;
    double angle = degree  * CV_PI / 180.;
    double a = sin(angle), b = cos(angle);
    int width = img.cols;
    int height = img.rows;
    int width_rotate = int(height * fabs(a) + width * fabs(b));
    int height_rotate = int(width * fabs(a) + height * fabs(b));

    // [ m0  m1  m2 ] ===>  [ A11  A12   b1 ]
    // [ m3  m4  m5 ] ===>  [ A21  A22   b2 ]
    float map[6];
    cv::Mat map_matrix = cv::Mat(2, 3, CV_32F, map);

    CvPoint2D32f center = cvPoint2D32f(width / 2, height / 2);
    CvMat map_matrix2 = map_matrix;
    cv2DRotationMatrix(center, degree, 1.0, &map_matrix2);
    map[2] += (width_rotate - width) / 2;
    map[5] += (height_rotate - height) / 2;
    cv::Mat img_rotate;

    warpAffine(img, img_rotate, map_matrix, cv::Size(width_rotate, height_rotate), 1, 0, 0);

    return img_rotate;
}
int main()
{
    Mat img = imread("/media/d_2/everyday/0506/marilyn.bmp");
    Mat img_cp = img.clone();
    int T_offset = 1;
    int T_rot = 2;
    cout<<"**********按键说明**********************"<<endl;
    cout<<"q :: 退出"<<endl;
    cout<<"b :: 放大"<<endl;
    cout<<"n :: 缩小"<<endl;
    cout<<"w :: 上"<<endl;
    cout<<"s :: 下"<<endl;
    cout<<"a :: 左"<<endl;
    cout<<"d :: 右"<<endl;
    cout<<"r :: 顺时针旋转"<<endl;
    cout<<"k :: 逆时针旋转"<<endl;
    cout<<"z :: 还原"<<endl;
    cout<<"**********按键说明**********************"<<endl;

    char c_key='+';
    while (c_key != 'q')
    {
        if('b'==c_key)
        {
            Size s = Size(img_cp.cols * 2, img_cp.rows * 2);
            if(abs(s.width - img.cols)<8)
            {
                img_cp = img.clone();
            }else
            {
                resize(img_cp, img_cp, s);
            }
        }
        if('n' == c_key)
        {
            Size s = Size(img_cp.cols / 2, img_cp.rows / 2);

            if(abs(s.width - img.cols)<8)
            {
                img_cp = img.clone();
            }else
            {
                resize(img_cp, img_cp, s);
            }
        }

        if('w' == c_key)
        {
            img_cp = pingyi(img_cp,0,-T_offset);
        }
        if('s' == c_key)
        {
            img_cp = pingyi(img_cp,0,T_offset);
        }
        if('a' == c_key)
        {
            img_cp = pingyi(img_cp,-T_offset,0);
        }放大-缩小-旋转
        if('d' == c_key)
        {
            img_cp = pingyi(img_cp,T_offset,0);
        }
        if('r' == c_key)
        {
            img_cp = rotateImg_(img_cp, T_rot);
        }
        if('k' == c_key)
        {
            img_cp = rotateImg_(img_cp, -T_rot);
        }

        if('z' == c_key)
        {
            img_cp = img.clone();
        }
        //namedWindow("img",WINDOW_NORMAL);
        imshow("img",img_cp);
        c_key = char(waitKey(0));
    }
    return 0;
}

  • 1
    点赞
  • 0
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页

打赏

无左无右

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值