第二十一节 图像旋转



void QUickdemo::roate_demo(Mat& image)
{
    Mat dst, M;
    int w = image.cols;
    int h = image.rows;
    M = getRotationMatrix2D(Point2f(w / 2, h / 2), 45, 1.0);--M = getRotationMatrix2D(Point2f(w / 2, h / 2), 45, 1.0);:使用getRotationMatrix2D函数生成一个旋转矩阵M。这个函数的参数分别是旋转中心(这里是图像的中心,即Point2f(w / 2, h / 2))、旋转角度(这里是 45 度)和缩放因子(这里是 1.0,表示不进行缩放)。


重新计算新图像尺寸
    double cos = abs(M.at<double>(0, 0));
    double sin = abs(M.at<double>(0, 1));

--double cos = abs(M.at<double>(0, 0)); double sin = abs(M.at<double>(0, 1));:从旋转矩阵中获取对应的值,用于计算新图像的宽度和高度。其中的cos和sin是计算新图像的重要数值。

在这段代码中,从M.at<double>(0, 0)和M.at<double>(0, 1)获取值是因为旋转矩阵的结构决定的。

一个 2D 旋转矩阵通常具有以下形式:

| cosθ  -sinθ |
| sinθ   cosθ |

其中,cosθ在第一行第一列(对应(0, 0)),sinθ在第一行第二列(对应(0, 1))。

代码中通过获取这两个位置的值,可以得到与旋转角度相关的余弦值和正弦值,用于后续计算旋转后图像的新宽度和新高度等操作。


    int nw = cos * w + sin * h;
    int nh = cos * h + sin * w;

--

int nw = cos * w + sin * h; int nh = cos * h + sin * w;:计算旋转后的图像的新宽度nw和新高度nh。
    M.at<double>(0, 2) += (nw / 2 - w / 2);
    M.at<double>(1, 2) += (nh / 2 - h / 2);

这两行代码的作用是调整旋转矩阵M中的平移量,以确保旋转后的图像中心与新图像的中心对齐。

1. M.at<double>(0, 2) += (nw / 2 - w / 2);

• M.at<double>(0, 2)代表旋转矩阵M中第一行第三列的元素,它控制着图像在水平方向上的平移量。

• nw / 2是新图像宽度的一半,w / 2是原始图像宽度的一半。计算nw / 2 - w / 2得到的是新图像中心与原始图像中心在水平方向上的偏移量。

• 将这个偏移量加到M.at<double>(0, 2)上,就调整了水平方向的平移量,使得旋转后的图像在水平方向上的中心与新图像的中心对齐。

2. M.at<double>(1, 2) += (nh / 2 - h / 2);

• 同理,M.at<double>(1, 2)是旋转矩阵M中第二行第三列的元素,控制着图像在垂直方向上的平移量。

• nh / 2是新图像高度的一半,h / 2是原始图像高度的一半。计算nh / 2 - h / 2得到新图像中心与原始图像中心在垂直方向上的偏移量。

• 将这个偏移量加到M.at<double>(1, 2)上,调整垂直方向的平移量,使得旋转后的图像在垂直方向上的中心与新图像的中心对齐。

    warpAffine(image, dst, M, Size(nw, nh), INTER_LINEAR, 0, Scalar(255, 0, 0));

这行代码使用 OpenCV 库中的 warpAffine 函数对图像进行仿射变换(这里主要是旋转)。

1. image:

• 这是输入的原始图像,即要进行旋转操作的图像。

2. dst:

• 这是输出的目标图像,函数执行后,经过旋转后的图像将存储在这个变量中。

3. M:

• 这是一个 2x3 的变换矩阵,它描述了如何对图像进行变换,包括旋转、平移、缩放等操作。在前面的代码中,这个矩阵是通过 getRotationMatrix2D 函数生成,并根据旋转角度和图像尺寸进行了调整。

4. Size(nw, nh):

• 这指定了输出图像的大小,其中 nw 是新图像的宽度,nh 是新图像的高度,这两个值在前面的计算中已经根据旋转角度和原始图像尺寸确定。

5. INTER_LINEAR:

• 这是插值方法的标志,表示在图像变换过程中使用线性插值。线性插值可以在图像放大或缩小时提供相对平滑的效果。

6. 0:

• 这是边界外推法的标志,这里表示使用默认的边界外推方法。

7. Scalar(255, 0, 0):

• 这是用于填充边界的颜色值,这里表示用蓝色(R = 255,G = 0,B = 0)填充边界。如果在图像变换过程中出现了新的边界区域,这些区域将用指定的颜色填充。

    imshow("tt", dst);


}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux学习网络编程学习(TCP和UDP)

文章目录 网络编程主要函数介绍1、socket函数2、bind函数转换端口和IP形式的函数 3、listen函数4、accept函数网络模式&#xff08;TCP&UDP&#xff09;1、面向连接的TCP流模式2、UDP用户数据包模式 编写一个简单服务端编程5、connect函数编写一个简单客户端编程 超级客户端…

jmeter入门:脚本录制

1.设置代理。 网络连接-》代理-》手动设置代理. ip&#xff1a; 127.0.0.1&#xff0c; port&#xff1a;8888 2. add thread group 3. add HTTP(s) test script recorder, target controller chooses Test plan-> thread Group 4. click start. then open the browser …

Windows环境下Qt Creator调试模式下qDebug输出中文乱码问题

尝试修改系统的区域设置的方法&#xff1a; 可以修复问题。但会出现其它问题&#xff1a; 比如某些软件打不开&#xff0c;或者一些软件界面的中文显示乱码&#xff01; 暂时没有找到其它更好的办法。

k8s的微服务

ipvs模式 Service 是由 kube-proxy 组件&#xff0c;加上 iptables 来共同实现的 kube-proxy 通过 iptables 处理 Service 的过程&#xff0c;需要在宿主机上设置相当多的 iptables 规则&#xff0c;如果宿主机有大量的Pod&#xff0c;不断刷新iptables规则&#xff0c;会消耗…

FreeRTOS应用开发学习

了解FreeRTOS 任务相关API FreeRTOS任务创建API FreeRTOS 中&#xff0c;任务的创建有两种方法&#xff0c;一种是使用动态创建&#xff0c;一种是使用静态创建。动态创建时&#xff0c;任务控制块和栈的内存是创建任务时动态分配的&#xff0c;任务删除时&#xff0c;内存可…

推动AI技术研发与应用,景联文科技提供专业高效图像采集服务

景联文科技提供专业图像采集服务&#xff0c;涵盖多个领域的应用需求。 包含人体图像、人脸图像、手指指纹、手势识别、交通道路、车辆监控等图像数据集&#xff0c;计算机视觉图像数据集超400TB&#xff0c;支持免费试采试标。 高质量人像采集服务&#xff1a;支持不同光线条件…

2024年10月16日练习

一.回文数&#xff1a; 思路一&#xff1a; 负数肯定就不是回文数了&#xff0c;所以负数就直接返回flase&#xff0c;正数的话就一位位分解&#xff0c;然后构成一个 新的整数&#xff0c;然后去判断两者是否相等即可&#xff1a; bool isPalindrome(int x) {if (x<0){r…

阿里Dataworks使用循环节点和赋值节点完成对mongodb分表数据同步

背景 需求将MongoDB数据入仓MaxCompute 环境说明 MongoDB 100个Collections&#xff1a;orders_1、orders_2、…、orders_100 前期准备 1、MongoDB数据源配置 需要先保证DW和MongoDB网络是能够联通的&#xff0c;需要现在集成任务中配置MongoDB的数据源信息。 具体可以查…

SldWorks问题 2. 矩阵相关接口使用上的失误

问题 在计算三维点在图纸&#xff08;DrawingDoc&#xff09;中的位置时&#xff0c;就是算不对&#xff0c;明明就4、5行代码&#xff0c;怎么看都是很“哇塞”的&#xff0c;毫无问题的。 但结果就是不对。 那就调试一下吧&#xff0c;调试后发现生成的矩阵很不对劲&#…

数学建模算法与应用 第15章 预测方法

目录 15.1 微分方程模型 Matlab代码示例&#xff1a;求解简单的微分方程 15.2 灰色预测模型&#xff08;GM&#xff09; Matlab代码示例&#xff1a;灰色预测模型 15.3 自回归模型&#xff08;AR&#xff09; Matlab代码示例&#xff1a;AR模型的预测 15.4 指数平滑法 M…

论文阅读-U3M(2)

HOW MUCH POSITION INFORMATION DO CONVOLUTIONAL NEURAL NETWORKS ENCODE? 文章目录 HOW MUCH POSITION INFORMATION DO CONVOLUTIONAL NEURAL NETWORKS ENCODE?前言一、位置编码网络&#xff08;PosENet&#xff09;二、训练数据三、实验3.1 位置信息的存在性3.2 分析PosEN…

单片机原理及应用笔记:C51的运算符与项目实践

单片机原理及应用笔记 作者简介 李永康&#xff0c;男&#xff0c;银川科技学院计算机与人工智能学院&#xff0c;2022级计算机与科学技术9班本科生&#xff0c;单片机原理及应用课程第7组。 指导老师&#xff1a;王兴泽 电子邮件&#xff1a;3214729183qq.com 个人CSDN主…

学习 PostgreSQL + Spring Boot 3 +mybatisplus整合过程中的报错记录

今天计划学习 PostgreSQL&#xff0c;并顺便尝试使用 Spring Boot 3.x 框架&#xff0c;打算整合 Spring Boot 3、PostgreSQL 和 MyBatis-Plus。整合后一直出现以下报错&#xff1a; 去AI上面搜了讲的是sqlSessionFactory 或 sqlSessionTemplate 没有正确配置 初始分析&#…

linux提权【笔记总结】

文章目录 信息收集通过命令收集信息内核&#xff0c;操作系统&#xff0c;设备信息等用户信息环境信息进程与服务安装的软件服务与插件计划任务查看是否存在明文密码查看与主机的通信信息查看日志信息 通过脚本收集信息LinEnum脚本介绍复现 Linuxprivchecker复现 linux-exploit…

URDF统一机器人建模语言

统一机器人建模语言 URDF&#xff08;Unified Robot Description Format&#xff09;统一机器人描述格式&#xff0c;URDF使用XML格式描述机器人文件。 我们从下面四个方面介绍URDF&#xff1a; URDF的组成介绍 URDF-Link介绍 URDF-Joint介绍 创建一个简单的URDF…

目标检测指标:AP,mAP

目标检测指标&#xff1a;AP&#xff0c;mAP 论文&#xff1a;A Survey on Performance Metrics for Object-Detection Algorithms 文章目录 目标检测指标&#xff1a;AP&#xff0c;mAP摘要1 介绍2 主要的性能指标TP、FP、FNP、RAP A P 11 AP_{11} AP11​ A P a l l AP_{all}…

Chromium HTML Tags与c++接口对应关系分析

一、HTML 标签(HTML Tags) <a> <head> <img>等等这些标签在c中的接口是如何定义和查找的呢&#xff1f; 更多标签参考&#xff1a; HTML <a> target 属性 (w3school.com.cn) 二、html_tag_names.json5 (third_party\blink\renderer\core\html\htm…

基于SpringBoot的体育商城购物系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【AI大模型】初识LangChain:功能强大的语言模型框架

目录 &#x1f354; 什么是LangChain &#x1f354; LangChain主要组件 2.1 Models 2.1.1 LLMs (大语言模型) 2.1.2 Chat Models (聊天模型) 2.1.3 提示模板 2.1.4 Embeddings Models(嵌入模型) 2.2 Prompts 2.3 Chains(链) 2.4 Agents (代理) 2.5 Memory 2.6 Inde…

爬虫post收尾以及cookie加代理

爬虫post收尾以及cookie加代理 目录 1.post请求收尾 2.cookie加代理 post收尾 post请求传参有两种格式&#xff0c;载荷中有请求载荷和表单参数&#xff0c;我们需要做不同的处理。 1.表单数据&#xff1a;data字典传参 content-type: application/x-www-form-urlencoded; …