Opencv的getRotationMatrix2D函数底层解析

news2024/11/16 21:21:37

源码

cv::Mat cv::getRotationMatrix2D( Point2f center, double angle, double scale )
{
    angle *= CV_PI/180;
    double alpha = cos(angle)*scale;
    double beta = sin(angle)*scale;
 
    Mat M(2, 3, CV_64F);
    double* m = M.ptr<double>();
 
    m[0] = alpha;
    m[1] = beta;
    m[2] = (1-alpha)*center.x - beta*center.y;
    m[3] = -beta;
    m[4] = alpha;
    m[5] = beta*center.x + (1-alpha)*center.y;
 
    return M;
}

推导

1、有图有真相

为什么这样画图,值得注意的是,计算机中图像的横坐标是向右增加,纵坐标是向下增加!!!

2、任务描述

其中角DAB=α,角CAB=θ

AD与横坐标轴平行,AE与纵坐标轴平行,现在需要沿着A点(centerX,centerY)==>>简写(cx,cy)作为旋转中心

将B点旋转θ角度后到达C点,假设C点坐标为(x',y'),求解x',y'和x,y,θ,cx,cy的数学关系

3、开始计算

AC由AB旋转得到,故其长度相等,令AC=AB=L

于是由三角函数知识

x'=cx+L*cos(α-θ)=cx+L*(cos(α)*cos(θ)+sin(α)*sin(θ))     1式

y'=cy+L*sin(α-θ)=cy+L*(sin(a)*cos(θ)-sin(θ)*cos(a))       2式

cos(α)=(x-cx)/L                                                                 3式

sin(a)=(y-cy)/L                                                                  4式

把3式,4式分别代入1式和2式,可以消去α和L。得到

x'=cx+(x-cx)*cos(θ)+(y-cy)*sin(θ)=x*cos(θ)+y*sin(θ)+cx*(1-cos(θ))-cy*sin(θ)

y'=cy+(y-cy)*cos(θ)-(x-cx)*sin(θ)=x*(-sin(θ))+y*cos(θ)+cy*(1-cos(θ))+cx*sin(θ)

提取出矩阵就是

[

        [cos(θ),sin(θ),cx*(1-cos(θ))-cy*sin(θ)],

        [-sin(θ),cos(θ),cy*(1-cos(θ))+cx*sin(θ)]

]

验证

实践是检验真理的唯一标准

上Python代码

import numpy as np
import cv2 as cv
import math

cx = 250
cy = 250
angle = 45
scale = 1.0

opencv_M = cv.getRotationMatrix2D((cx, cy), angle, scale)
print(f"opencv_M=\n{opencv_M}")

print("=================================")

cos_angle = math.cos(angle / 180.0 * math.pi)
sin_angle = math.sin(angle / 180.0 * math.pi)
self_M = np.array([
    [cos_angle, sin_angle, cx * (1 - cos_angle) - cy * sin_angle],
    [-sin_angle, cos_angle, cy * (1 - cos_angle) + cx * sin_angle]
])
print(f"self_M=\n{self_M}")

旋转中心(cx,cy)=(250,250)

旋转角度θ=45°

不进行缩放操作scale=1.0

运行结果

可以看出,运算结果是一模一样的,此函数的运算过程确实如上述公式所示

注意

python中math函数库的三角函数输入参数,是转换成多少pi,而不是直接输入一个角度,(准确地说,它接受的是弧度)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python怎么装pip库

Python怎么装pip库 Python是一种高级编程语言&#xff0c;由于其简单易学和功能强大&#xff0c;成为众多开发者的选择。但是在开发过程中&#xff0c;需要使用到各种库。pip是Python的软件包管理器&#xff0c;通过pip工具&#xff0c;我们可以轻松地安装和管理Python库。 什…

iOS 单元测试之常用框架 OCMock 详解 | 京东云技术团队

一、单元测试 1.1 单元测试的必要性 测试驱动开发并不是一个很新鲜的概念了。在日常开发中&#xff0c;很多时候需要测试&#xff0c;但是这种输出是必须在点击一系列按钮之后才能在屏幕上显示出来的东西。测试的时候&#xff0c;往往是用模拟器一次一次的从头开始启动 app&a…

chatgpt赋能python:Python怎么让输出不换行

Python怎么让输出不换行 Python是一款具有高度灵活性和扩展性的语言&#xff0c;代码简洁易懂&#xff0c;易上手。在Python编程中&#xff0c;输出的相关操作也是非常常见的。在某些情况下&#xff0c;我们需要让输出内容在同一行显示&#xff0c;这时我们需要使用Python提供…

【Docker】技术架构演进

基本概念 应用&#xff08;Application&#xff09; / 系统&#xff08;System&#xff09; ​ 为了完成一整套服务的一个程序或者一组相互配合的程序群。生活例子类比&#xff1a;为了完成一项任务&#xff0c;而搭建的由一个人或者一群相互配的人组成的团队。 模块&#xff0…

C++【STL】之list的使用

文章目录&#xff1a; list介绍list使用1. 默认成员函数1.1 构造函数1.2 拷贝构造1.3 赋值重载1.4 析构函数 2. 迭代器3. 容量操作4. 数据访问5. 数据修改5.1 插入删除5.2 交换调整清理 6. 其他操作6.1 链表拼接6.2 链表移除6.3 排序6.4 链表逆置 list介绍 list是可以在常数范围…

STM32软件定时器

目录 什么是定时器&#xff1f; 软件定时器优缺点 软件定时器原理 软件定时器相关配置 单次定时器和周期定时器 软件定时器相关 API 函数 1. 创建软件定时器 2. 开启软件定时器 3. 停止软件定时器 4. 复位软件定时器 5. 更改软件定时器定时时间 实操 cubeMX配置 …

chatgpt赋能python:Python设置画布背景颜色

Python设置画布背景颜色 Python语言是一种广泛应用于科学计算、数据处理和数据可视化的高级脚本语言。它之所以如此流行&#xff0c;主要是因为它简单易学&#xff0c;并且具有很强的灵活性。在Python中&#xff0c;我们可以使用各种库来创建图形化界面、游戏和数据可视化应用…

C高级 day35

1、ubuntu的网络配置 1、查看网络是否连接 ping baidu.com 2、保证虚拟机有桥接网络 虚拟机---->设置---->网络适配器------>选择桥接或者是Vmnet0 给虚拟机添加桥接网络&#xff0c;如果没有vmnet0&#xff0c;添加网络 3、配置虚拟机的桥接网络 右上角网络图标-----…

RunCat 自定义动图

下载资源 下载资源 Runners Store 在商店购买 Self-Made Runner 设置 添加多张图片 下载 zhiyin_basketball 图片 zhiyin_basketball 下载 更新版本 设置图片 Format: PNGHeight: 36pxWidth: 10~100px 调整图片大小 使用convert命令查看图片宽和高 convert 0.png -print …

MFC视类和框架类学习1

VC6新建一个单文档工程&#xff0c;名称为test&#xff1b;将会生成如下的类&#xff1b; 这里说的框架类是指CMainFrm类&#xff1b; 视类是指CxxxxView类&#xff1b; 生成的视类公共继承自CView类&#xff0c; class CTestView : public CView { ...... CView类继承自CWnd…

安装ps出现计算机丢失d3dcompiler_47.dll缺失的解决方法

本教程操作系统&#xff1a;Windows系统、 d3dcompiler_47.dll是电脑文件中的dll文件&#xff08;动态链接库文件&#xff09;。如果计算机中丢失了某个dll文件&#xff0c;可能会导致某些软件和游戏等程序无法正常启动运行&#xff0c;并且导致电脑系统弹窗报错。 在我们打开…

局域网视频会议系统相较于SaaS会议系统的优势

局域网视频会议系统和SaaS会议系统都是远程协作和视频通讯的应用技术&#xff0c;各自有各自的特点和功能。 局域网视频会议系统相较于SaaS会议系统可以具备以下一些优势&#xff1a; 1. 安全性更高&#xff1a;局域网视频会议系统在企业内部进入&#xff0c;采用专属的内外网安…

Win10电脑C盘爆红了可以删除哪些文件?

Win10电脑C盘爆红了可以删除哪些文件&#xff1f;Win10电脑中用户发现C盘爆红了&#xff0c;想通过删除C盘内的文件来解决C盘爆红的问题&#xff0c;那么哪些文件可以删除呢&#xff0c;用户可以打开Temp、Help、Prefectch等文件夹进行删除&#xff0c;以下就是Win10电脑C盘爆红…

Python入门基本练习题(54题)

Python入门基本练习题&#xff08;54题&#xff09; 目录 第一节 、Python基础关键字和语法 1、 用单引号括出需要打印输出的内容 2、 用双引号括出需要打印输出的内容 3、 用三引号括出需要打印输出的内容 4、 \n&#xff08;换行符&#xff09;的使用 5、 \t&#xff0…

chatgpt赋能python:Python词云入门:构建你自己的词云图

Python词云入门&#xff1a;构建你自己的词云图 如果你是一个数据科学家或者是数据分析师&#xff0c;那么你肯定已经听过了“词云图”这个词。词云图是数据可视化的一种方式&#xff0c;用于呈现文本数据中最频繁出现的词汇。在这篇文章中&#xff0c;我将提供一个详细的教程…

前端怎么使用node-input-validator给接口添加参数校验(以strapi 4.9为例)

node-input-validator是什么&#xff1f; 简称NIV (Node Input Validator)用于node.js的验证库使用它可以扩展库以添加自定义规则。npm NIV文档 使用方法 我们以strapi 4.9 版本项目为例&#xff0c;来试用一下它对我们接口的校验规则 下载依赖 npm i node-input-validat…

【人工智能】人工智能和双曲几何

一、说明 作为人工智能技术的理论支撑&#xff0c;几何学是必不可少的&#xff1b;目前直接的几何技术有&#xff1a;计算几何--对集合体如点云处理有用&#xff1b;射影几何--对3d重构有用&#xff1b;双曲几何--在自然语言的词嵌入做基础数学模型&#xff0c;另外深度学习国外…

Intellij IDEA编写Spark应用程序的环境配置和操作步骤

本文介绍如何在win系统中使用IDEA开发spark应用程序&#xff0c;并将其打成jar包上传到虚拟机中的三个Ubuntu系统&#xff0c;然后在分布式环境中运行。 主要步骤包括&#xff1a; 安装Scala插件&#xff1a;在Intellij IDEA中安装Scala插件&#xff0c;并重启IDEA。创建Mave…

航空保障装备虚拟3d展览展示仿真系统助力企业降本增效

航空装备被认为是一个现代化国家核心竞争力的集中体现。航空装备制造业不仅是维护发展环境稳定的重要保障&#xff0c;也是推动经济转型升级的战略性产业。 3D虚拟展示技术是数字化转型中一项不可或缺的技术手段&#xff0c;将3D虚拟现实技术与工业制造业的有机融合&#xff0c…

chatgpt赋能python:Python第三方包安装方法详解

Python第三方包安装方法详解 为什么要安装第三方包&#xff1f; 在Python编程中&#xff0c;常常需要使用到一些额外的功能模块&#xff0c;但是Python自身不具备这些功能&#xff0c;需要通过安装第三方包来实现。例如&#xff0c;Python标准库中没有Jupyter Notebook工具&a…