【C++造神计划】数学运算

数学运算库

//二者选一
#include <cmath>
#include <math.h>// #include <math.h>
#include <cmath>
#include <stdio.h>int main()
{float res;res = sqrt(2);res = abs(-5.3);res = sin(0.5*M_PI);res = asin(res);res = cos(0.5*M_PI);res = acos(res);res = tan(0.3333*M_PI);res = atan(res);res = pow(2, 3);res = log(10);res = log10(10);printf("res = %f\n", res);return 0;
}

位运算

位运算符以比特位改写变量存储的数值,也就是改写变量值的二进制表示∶

  • & 逻辑与(Logic AND)
  • | 逻辑或(Loglc OR)
  • ^ 逻辑异或(Logical exclusive OR)
  • ~ 位反转 (Complement to one(bit inversion))
  • << 左移 (Shift Left): 乘以 2 n 2^n 2n
  • >> 右移 (Shfft Right): 除以 2 n 2^n 2n

<<

#include <stdio.h>
#include <math.h>typedef unsigned int uint32_t;int main() {uint32_t n_bit = 4;printf("     2 << 4 = %u\n", 2 << 4);printf("2*pow(2, 4) = %u\n", (uint32_t)(2*pow(2, 4)));return 0;
}

>>

#include <stdio.h>
#include <math.h>typedef unsigned int uint32_t;int main() {uint32_t n_bit = 4;printf("     160 >> 4 = %u\n", 160 >> 4);printf("160/pow(2, 4) = %u\n", (uint32_t)(160/pow(2, 4)));return 0;
}

Example

template <typename F>
__device__ inline float one_blob_subwarp_aligned(F kernel, MatrixView<const float> data_in, const uint32_t elem_index, const uint32_t encoded_index, const uint32_t num_bins_log2) {const uint32_t n_bins = 1 << num_bins_log2;const uint32_t bin_index = encoded_index & (n_bins - 1);const float x = data_in(encoded_index >> num_bins_log2, elem_index);const float left_boundary = scalbnf(bin_index, -num_bins_log2);float left_cdf = kernel(left_boundary - x, n_bins) + kernel(left_boundary - x - 1.0f, n_bins) + kernel(left_boundary - x + 1.0f, n_bins);float right_cdf = __shfl_sync(0xffffffff, left_cdf, bin_index + 1, n_bins);if (bin_index == n_bins - 1) {right_cdf += 1; // The right CDF must gain a 1 due to wrapping from right to left (it lost one (hopefully) saturated CDF)}return right_cdf - left_cdf;
}

Exercise - 相机模型

这个模型有很多种,其中最简单的称为针孔模型。针孔模型是很常用,而且有效的模型,它描述了一束光线通过针孔之后,在针孔背面投影成像的关系

蜡烛投影

在一个暗箱的前方放着一支点燃的蜡烛,蜡烛的光透过暗箱上的一个小孔投影在暗箱的后方平面上,并在这个平面上形成了一个倒立的蜡烛图像。在这个过程中,小孔模型能够把三维世界中的蜡烛投影到一个二维成像平面

针孔相机模型建模


现在来对这个简单的针孔模型进行几何建模。设:

  • O x y z O_{xyz} Oxyz 为相机坐标系
    • O O O 为摄像机的光心,也是针孔模型中的针孔
    • [right, down, forward],让 z 轴指向相机前方, x x x 向右, y y y 向下(不同的软件有自己的定义)
  • 现实世界的空间点 P P P,经过小孔 O O O 投影之后,落在物理成像平面 O x ′ y ′ z ′ ′ O'_{x'y'z'} Oxyz 上,像点为 P ′ P' P
    • P P P 的坐标: [ X , Y , Z ] T [X, Y, Z]^T [X,Y,Z]T
    • P ′ P' P的坐标: [ X ′ , Y ′ , Z ′ ] T [X', Y', Z']^T [X,Y,Z]T
  • 并且设物理成像平面到小孔的距离为 f f f(焦距)

那么,根据三角形相似关系,有:
Z f = − X X ′ = − Y Y ′ \frac{Z}{f} = -\frac{X}{X'} = -\frac{Y}{Y'} fZ=XX=YY

其中负号表示成的像是倒立的。为了简化模型,我们把可以成像平面对称到相机前方,和三维空间点一起放在摄像机坐标系的同一侧。这样做可以把公式中的负号去掉,使式子更加简洁:

Z f = X X ′ = Y Y ′ \frac{Z}{f} = \frac{X}{X'} = \frac{Y}{Y'} fZ=XX=YY

整理得:
{ X ′ = f X Z Y ′ = f Y Z \begin{cases}X' = f\frac{X}{Z}\\ \\ Y' = f\frac{Y}{Z} \end{cases} X=fZXY=fZY

#include <stdio.h>int main()
{float focal = 0.5; // 500mmfloat Xreal = 2; // mfloat Yreal = 4; // mfloat Zreal = 6; // mfloat Xproj = focal * Xreal / Zreal;float Yproj = focal * Yreal / Zreal;printf("Point in 3D space: (X,Y,Z) = (%f, %f, %f)\n", Xreal, Yreal, Zreal);printf("Project to: (X',Y,focal) = (%f, %f, %f)\n", Xproj, Yproj, focal);return 0;
}

从物体到像素

在相机中,我们最终获得的是图片上一个个的像素,这需要在成像平面上对像进行采样和量化

为了描述传感器将感受到的光线转换成图像像素的过程,我们设在物理成像平面上固定着一个像素平面 o-u-v。我们在像素平面得到了 P ′ P' P 的像素坐标: [ u , v ] T [u, v]^T [u,v]T

像素坐标系通常的定义方式是:原点 o ′ o' o位于图像的左上角, u u u 轴向右与 x x x 轴平行, v v v 轴向下与 y y y 轴平行。像素坐标系与成像平面之间,相差了

  • 一个缩放
    • 设像素坐标在 u u u 轴上缩放了 α α α
    • v v v 上缩放了 β β β
  • 一个原点的平移:设原点平移了 [ c x , c y ] T [c_x, c_y]^T [cx,cy]T

那么, P ′ P' P 的坐标与像素坐标 [ u , v ] T [u, v]^T [u,v]T 的关系为:

{ u = α X ′ + c x v = β Y ′ + c y \begin{cases} u = \alpha X' + c_x \\ v = \beta Y' + c_y\end{cases} {u=αX+cxv=βY+cy

#include <stdio.h>int main()
{float focal = 0.5; // 500mmfloat alpha = 100;float beta  = 100;float cx    = 0.32; // 320mmfloat cy    = 0.24; // 2400mmfloat Xreal = 2; // mfloat Yreal = 4; // mfloat Zreal = 6; // mfloat Xproj = focal * Xreal / Zreal;float Yproj = focal * Yreal / Zreal;int u = alpha * Xproj + cx;int v = beta  * Yproj + cy;printf("Point in 3D space: (X,Y,Z) = (%f, %f, %f)\n", Xreal, Yreal, Zreal);printf("Project to: (X',Y,focal) = (%f, %f, %f)\n", Xproj, Yproj, focal);printf("Pixel coordinates: (u,v) = (%d, %d)\n", u, v);return 0;
}

合并简化

将式子:
{ X ′ = f X Z Y ′ = f Y Z \begin{cases}X' = f\frac{X}{Z}\\ \\ Y' = f\frac{Y}{Z} \end{cases} X=fZXY=fZY

代入
{ u = α X ′ + c x v = β Y ′ + c y \begin{cases} u = \alpha X' + c_x \\ v = \beta Y' + c_y\end{cases} {u=αX+cxv=βY+cy
并把 α f \alpha f αf 合并成 f x f_x fx,把 β f \beta f βf 合并成 f y f_y fy,得:

{ u = f x X Z + c x v = f y Y Z + c y \begin{cases} u = f_x \frac{X}{Z} + c_x \\ v = f_y \frac{Y}{Z} + c_y\end{cases} {u=fxZX+cxv=fyZY+cy

  • X , Y , Z X,Y,Z XYZ:相机坐标的 X , Y , Z X,Y,Z XYZ(深度 depth)
  • f x , f y f_x,f_y fxfy:缩放系数和焦距的乘积
  • c x , c y c_x,c_y cxcy:中心偏移量
  • u , v u,v uv:像素坐标
#include <stdio.h>int main()
{float focal = 0.5; // 500mmfloat alpha = 100;float beta  = 100;// Intrisic Parameters 相机内参float fx    = alpha * focal;float fy    = beta  * focal;float cx    = 0.32; // 320mmfloat cy    = 0.24; // 240mmfloat Xreal = 2; // mfloat Yreal = 4; // mfloat Zreal = 6; // mint u = fx * Xreal/Zreal + cx;int v = fy * Yreal/Zreal + cy;printf("Point in 3D space: (X,Y,Z) = (%f, %f, %f)\n", Xreal, Yreal, Zreal);printf("Pixel coordinates: (u,v) = (%d, %d)\n", u, v);return 0;
}

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

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

相关文章

通过Dockerfile 创建 kali-novnc

创建Dockerfile # 使用官方Kali镜像作为基础镜像 FROM kalilinux/kali-rolling# 设置工作目录 WORKDIR /app# 将当前目录下的所有文件复制到工作目录中 COPY ./run.sh .# 安装项目依赖 RUN apt update -y RUN apt upgrade -y RUN apt install dbus-x11 xfce4 tightvncserver …

【c++】stack和queue使用 stack和queue模拟实现

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;c_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1. stack的介绍和使用 1.1 stack的介绍 1.2 stack的使用 1.3 stack的模拟实现 2. queue的介绍和使用 2.1 queue的介绍 2.2 queue的…

Unity中使用NewtonJson序列化继承类时报错解决方法参考

在Unity中使用NewtonJson时&#xff0c;如果要序列化的类继承了别的类&#xff0c;可能报如下错误&#xff1a; JsonSerializationException: Self referencing loop detected for property...... 解决的方法是新建一个JsonSerializerSettings对象&#xff0c;并设置对象的Ref…

Golang面试题五(GC)

目录 1.Golang GC版本 2.常见的垃圾回收算法有以下几种 3.怎么找到程序中无用的对象 引用计数法 根搜索法 GC roots对象 4.java与go的GC对比 5.三色标记法 1.Golang GC版本 Go 1.3版本&#xff1a;普通标记清除法&#xff0c;整体过程需要启动STW&#xff0c;效率极低。…

SpringBoot之JWT令牌校验

SpringBoot之JWT令牌校验 本文根据黑马b站springboot3vue3课程 JWT &#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在不同实体之间安全地传输信息。它由三个部分组成&#xff1a;头部&#xff08;Header&#xff09;…

如何实现音乐音频合并?分享3种简单的合并技巧!音频合并的方法

音乐合并&#xff0c;作为一种音乐创作与编辑的手法&#xff0c;已经逐渐在音乐制作领域占据了一席之地。音乐合并不仅是对音乐元素的重新组合&#xff0c;更是对音乐内涵的深化和拓展。它可以将不同的音乐风格和元素巧妙地融合在一起&#xff0c;创造出全新的听觉体验。 一&a…

DonkeyDocker-v1-0渗透思路

MY_BLOG https://xyaxxya.github.io/2024/04/13/DonkeyDocker-v1-0%E6%B8%97%E9%80%8F%E6%80%9D%E8%B7%AF/ date: 2024-04-13 19:15:10 tags: 内网渗透Dockerfile categories: 内网渗透vulnhub 靶机下载地址 https://www.vulnhub.com/entry/donkeydocker-1,189/ 靶机IP&a…

芯片设计围炉札记

文章目录 语言Verilog 和 VHDL 区别 芯片验证 语言 System Verilog的概念以及与verilog的对比 IC 设计软件分析 Verilog 和 VHDL 区别 Verilog HDL 和 VHDL 的区别如下&#xff1a; 语法结构&#xff1a;Verilog的语法结构类似于C语言&#xff0c;而VHDL的语法结构则更接近…

苍穹外卖学习记录(一)

1.JWT令牌认证 JSON Web Token (JWT)是一个开放标准(RFC 7519)&#xff0c;它定义了一种紧凑的、自包含的方式&#xff0c;用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任&#xff0c;因为它是数字签名的。 JWT是目前最常用的一种令牌规范&#xff0c;它最…

QT-编译报库错误(LF/CRLF)

QT-安装后环境问题记录 版本和环境问题 版本和环境 QT5.15.2 Windows10 QT Creator 问题 在QT夸端开发的项目中 &#xff0c;使用QTCreator打开项目pro文件&#xff0c;编译报出很多系统库 及本地文件中的一些问题&#xff0c;具体如图&#xff1a; 后续&#xff0c;我以为…

L1-059 敲笨钟

原题链接&#xff1a;https://pintia.cn/problem-sets/994805046380707840/exam/problems/1111914599412858880?type7&page0 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 微博上有个自称“大笨钟V”的家伙&#xff0c;每天敲钟催促码农们爱惜身体早点睡觉…

数字人结合动捕设备化身虚拟主持人如何玩转大型活动?

由十五运会和残特奥会广州赛区执委会、广州市政府新闻办、广州市科学技术局联合举办的“科技赋能 畅想全运”故事会上&#xff0c;数字人“小运”结合动捕设备化身虚拟主持人惊喜亮相&#xff0c;与真人主持人趣味互动&#xff0c;并向大众介绍了其后续将在大运会上给运动员、工…

photoshop2022增效工具ICOFormat.8bi(PS ico插件)

先退出关闭ps 1、下载插件压缩包&#xff0c;解压出ICOFormat.8bi文件&#xff0c;有两个版本ICOFormat64.8bi对应32位版、ICOFormat64.8bi对应64位版本。 2、把解压后的ICOFormat64.8bi文件覆盖到Photoshop安装目录: C:\Program Files\Adobe\Adobe Photoshop 2022\Required…

【机器学习算法介绍】(6)随机森林

随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;主要用于分类和回归任务。它通过构建多个决策树&#xff08;Decision Trees&#xff09;并汇总它们的预测结果来提高整体模型的性能。随机森林的核心思想在于“集体智慧”——单个模型&#xff08…

redis的主从复制(docker方式快速入门和实战)

目录 一、主从复制简介 二、配置主从服务器 2.1使用配置文件的形式来主从复制 2.2使用纯代码的方式来进行主从复制&#xff1b; 2.3脱离主服务器 三、一些注意事项 一、主从复制简介 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器…

APEX开发过程中需要注意的小细节5.5

oracle保留小数点后两位的函数 在日常开发中经常用到百分比做数据对比&#xff0c;但是有可能得到的数据是一个多位小数&#xff0c;结果如下所示&#xff1a; 如果想截取部分小数如保留小数点后两位可以怎么做呢&#xff1f; 在Oracle中&#xff0c;可以使用ROUND函数来四舍…

51单片机入门_江协科技_31~32_OB记录的自学笔记_LCD1602液晶显示屏

31. LCD1602 31.1. LCD1602介绍 •LCD1602&#xff08;Liquid Crystal Display&#xff09;液晶显示屏是一种字符型液晶显示模块&#xff0c;可以显示ASCII码的标准字符和其它的一些内置特殊字符&#xff0c;还可以有8个自定义字符 •显示容量&#xff1a;162个字符&#xff0c…

二、Maven安装

Maven安装 一、Centos7.9安装1.下载2.安装3.设置国内镜像4.设置maven安装路径 一、Centos7.9安装 1.下载 第一种&#xff1a;官网下载最新版本&#xff1a;http://maven.apache.org/download.cgi第二种&#xff1a;其他版本下载&#xff1a;https://archive.apache.org/dist/…

数据中心的新动脉:探索ADOP 800G MPO/MTP单模光纤跳线

在数据传输领域&#xff0c;随着技术的不断进步&#xff0c;对于更快、更高效的传输解决方案的需求日益增长。ADOP 800G MPO/MTP单模光纤跳线便是在这样的背景下应运而生的产品。本文将为您提供一个全面而详细的介绍&#xff0c;带您深入了解这款创新产品的特点、优势以及应用场…

国产主流数据库存储类型简析

国产数据库在技术架构上主要分为集中式、基于中间件分布式和原生分布式架构&#xff0c;衍生出集中式架构和分布式架构。那么在这些部署架构中&#xff0c;从数据分布的视角来看&#xff0c;在数据库中数据分布的形态是怎样的。本文将简要分析OceanBase、PolarDB、OpenGauss、G…