二十一、图像旋转

项目功能实现:对一张图像进行旋转完全显示,且空白区域用绿色填充
按照之前的博文结构来,这里就不在赘述了

一、头文件

rotating.h

#pragma once#include<opencv2/opencv.hpp>using namespace cv;class ROTATING {
public:void rotating(Mat & image);
};#pragma once

二、函数实现

rotating.cpp

在这里插入图片描述

对于一张图片进行旋转,主要依靠于一个矩阵就可以实现
OpenCV中所需的矩阵为M,是一个[2,3]的矩阵,最后一列表示向x和y轴方向移动的信息

OpenCV提供API可以进行构建M矩阵
M = getRotationMatrix2D(Point2f(w / 2, h / 2), 45, 1.0);
参数一:图片的中心位置
参数二:旋转的角度
参数三:是否在旋转过程中进行缩放,1.0表示保存原始尺寸不进行缩放

得到M之后,根据M的结构
double cos = abs(M.at<double>(0, 0));,通过(0,0)获取得到cosθ
double sin = abs(M.at<double>(0, 1));,通过(0,1)获取得到sinθ

一张图片旋转之后必须通过更大的区域才能将其完全展示下来,故旋转之后展示的大小需要变大,要不然没法把旋转后的图片完全展示出来
在这里插入图片描述
最终求得新的窗口高宽
int new_w = w * cos + h * sin;
int new_h = w * sin + h * cos;

需要对原先的M的后一列赋值,表示进行x和y方向的移动,这样才能将图片完全给展示出来,在原来的基础上移动一半即可
M.at<double>(0, 2) += (new_w / 2 - w / 2);
M.at<double>(1, 2) += (new_h / 2 - h / 2);

warpAffine(image, result, M, Size(new_w,new_h), INTER_LINEAR, 0, Scalar(0, 255, 0));
参数一:处理的图片对象
参数二:输出的图片对象
参数三:仿射变换矩阵M
参数四:输出图像的尺寸大小
参数五:插值方法
参数六:像素外推法,默认为0即可
参数七:其他空白区域填充的颜色

#include"rotating.h"
#include<iostream>
#include<opencv2/opencv.hpp>void ROTATING::rotating(Mat& image) {Mat result, M;//M是一个2*3的变换矩阵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));double sin = abs(M.at<double>(0, 1));int new_w = w * cos + h * sin;int new_h = w * sin + h * cos;M.at<double>(0, 2) += (new_w / 2 - w / 2);M.at<double>(1, 2) += (new_h / 2 - h / 2);warpAffine(image, result, M, Size(new_w,new_h), INTER_LINEAR, 0, Scalar(0, 255, 0));imshow("rotating",result);
}

三、主函数

yy_main.cpp

#include <opencv2/opencv.hpp>
#include <iostream>
#include "rotating.h"using namespace cv;
using namespace std;int main(int argc, char** argv) {Mat src = cv::imread("E:/C++_workspace/beyond.jpg", IMREAD_COLOR);if (src.empty()) {printf("load image is false...\n");return -1;}namedWindow("yanyu", WINDOW_FREERATIO);imshow("yanyu", src);ROTATING yy;yy.rotating(src);waitKey(0);destroyAllWindows();return 0;
}

项目结构如下:
在这里插入图片描述
运行效果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/486545.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2/23作业

1.loop_list.c #include "loop_list.h" //创建单向循环链表 loop_p creat_loop_list() { loop_p K (loop_p)malloc(sizeof(loop_list)); if(KNULL) { printf("空间申请成功\n"); } K->len0; K->nextK; return…

2024网络安全人才春招正式启动(附面试真题)

新年新气象&#xff01;新的网安春招即将开始~ 话不多说&#xff0c;在此先给大家送上一份新年礼物《春招安全研究岗位面经分享》&#xff0c;祝各位都能找到满意的工作&#xff01; CSDN大礼包&#xff1a;《黑客&网络安全入门&进阶学习资源包》免费分享 安恒卫兵实…

外包干了3个月,技术退步明显

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

产品渲染3D效果图一张多少钱,哪个平台更有性价比?

产品渲染3D效果图的价格受到多方面因素的影响&#xff0c;包括但不限于产品类型、渲染难度以及输出尺寸等。如果效果图需要后期处理&#xff0c;还有可能增加其他费用。接下来&#xff0c;我们来了解一下产品渲染效果图的费用情况。 1.产品渲染3D效果图一张多少钱&#xff1f; …

Canal + Kafka 同步 MySQL 数据到 Redis

解决缓存和数据库一致性问题 一般来说&#xff0c;缓存中的数据没什么问题&#xff0c;但是数据库更新后&#xff0c;就容易出现缓存&#xff08;Redis&#xff09;和数据库&#xff08;MySQL&#xff09;间的数据一致性问题。由于写和读是并发的&#xff0c;没法保证顺序&…

openEuler安装MySQL客户端、openEuler安装MySQL-client、openEuler部署MySQL-client

MySQL客户端下载链接&#xff1a;https://downloads.mysql.com/archives/community/ mysql-community-client-5.7.30-1.el7.x86_64.rpm mysql-community-common-5.7.30-1.el7.x86_64.rpm mysql-community-libs-5.7.30-1.el7.x86_64.rpm 3个必选 8.0.22以上的版本是4个&…

【C++私房菜】面向对象中的多重继承以及菱形继承

文章目录 一、多重继承1、多重继承概念2、派生类构造函数和析构函数 二、菱形继承和虚继承2、虚继承后的构造函数和析构函数 三、has-a 与 is-a 一、多重继承 1、多重继承概念 **多重继承&#xff08;multiple inheritance&#xff09;**是指从多个直接基类中产生派生类的能力…

AI副业项目分享

在上一篇文章《这才是大学生该做的副业&#xff0c;别再痴迷于游戏了&#xff01;》中&#xff0c;我分享了一些副业的想法&#xff0c;接着有不少同学问我&#xff1a;具体如何做&#xff1f;这是真把我给整蒙了&#xff0c;这里分享下我可以提供的产品和服务吧&#xff0c;并…

【Qt】鼠标拖拽修改控件尺寸---八个方位修改

前提 在开发一个类似qdesiger的项目中 使用QGraphicsProxyWidget将Qt基础控件作为item放在场景视图中显示和编辑 创建自定义类继承QGraphicsProxyWidget&#xff0c;管理控件 成员变量 有控件的xywh等&#xff0c;其中x、y坐标存储是基于最底层widgetitem的 坐标系 x轴以右为正…

爬虫知识--03

数据存mysql import requests from bs4 import BeautifulSoup import pymysql# 链接数据库pymysql conn pymysql.connect(userroot,password"JIAJIA",host127.0.0.1,databasecnblogs,port3306, ) cursor conn.cursor() cursor conn.cursor()# 爬数据 res request…

2024年阿里云新用户购买云服务器优惠活动整理和续费折扣

2024阿里云服务器优惠活动政策整理&#xff0c;轻量2核2G3M服务器61元一年、2核4G4M带宽165元1年&#xff0c;云服务器4核16G10M带宽26元1个月、149元半年&#xff0c;阿里云ECS云服务器2核2G3M新老用户均可99元一年续费不涨价&#xff0c;企业用户2核4G5M带宽199元一年&#x…

华清远见作业第四十一天——Qt(第三天)

思维导图&#xff1a; 编程 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如…