GAMES101-计算机图形学入门 LEC4: TRANSFORMATION-3D

news2024/9/27 21:23:05

本节课程视频地址:https://www.bilibili.com/video/BV1X7411F744/?p=4

补充上一节课的一个内容,旋转矩阵的逆矩阵是它的转置,也就是说有 R − θ = R θ − 1 = R θ T R_{-\theta} = R_\theta^{-1}=R_\theta^T Rθ=Rθ1=RθT

上节课讲了,二维变换中的绕原点的旋转、缩放、切变,以及齐次坐标,还有通过简单变换组合成复杂变换。

这节课先讲三维变换,然后讲困难且重要的观测变换(Viewing Transformation)

文章目录

  • 三维变换(3D Transformation)
    • 缩放
    • 平移
    • 旋转
    • Rodrigues 旋转公式
  • 观测变换 (Viewing transformation)
    • 视图变换 (View transformation)
    • 投影变换(Perspective Projection)
      • 正交投影
      • 透视投影

三维变换(3D Transformation)

三维的齐次坐标:

  • 点: ( x , y , z , 1 ) T (x,y,z,1)^T (x,y,z,1)T
  • 向量: ( x , y , z , 0 ) T (x,y,z,0)^T (x,y,z,0)T

注:(x,y,z,w)其中w!=0 表示的是点(x/w,y/w,z/w)

齐次坐标使用4维矩阵来表示仿射变换:
[ x ′ y ′ z ′ 1 ] = [ a b c t x d e f t y g h i t z 0 0 0 1 ] ⋅ [ x y z 1 ] \begin{bmatrix} x'\\ y' \\ z' \\ 1 \end{bmatrix}= \begin{bmatrix} a&b&c&t_x\\ d&e&f&t_y\\ g&h&i&t_z \\ 0&0&0&1 \end{bmatrix} \cdot \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix} xyz1 = adg0beh0cfi0txtytz1 xyz1
注:仿射变换中是先线性变换(也就是绕原点所作的变换)再平移变换。

缩放

[ x ′ y ′ z ′ 1 ] = [ s x 0 0 0 0 s y 0 0 0 0 s z 0 0 0 0 1 ] ⋅ [ x y z 1 ] \begin{bmatrix} x'\\ y' \\ z' \\ 1 \end{bmatrix}= \begin{bmatrix} s_x&0&0&0\\ 0&s_y&0&0\\ 0&0&s_z&0\\ 0&0&0&1 \end{bmatrix} \cdot \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix} xyz1 = sx0000sy0000sz00001 xyz1

平移

[ x ′ y ′ z ′ 1 ] = [ 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ] ⋅ [ x y z 1 ] \begin{bmatrix} x'\\ y' \\ z' \\ 1 \end{bmatrix}= \begin{bmatrix} 1&0&0&t_x\\ 0&1&0&t_y\\ 0&0&1&t_z\\ 0&0&0&1 \end{bmatrix} \cdot \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix} xyz1 = 100001000010txtytz1 xyz1

旋转

三维的旋转分为绕x轴旋转、绕y轴旋转和绕z轴旋转。

R x ( α ) = [ 1 0 0 0 0 c o s α − s i n α 0 0 s i n α c o s α 0 0 0 0 1 ] R_x(\alpha) = \begin{bmatrix} 1&0&0&0\\ 0&cos\alpha&-sin\alpha&0\\ 0&sin\alpha&cos\alpha&0\\ 0&0&0&1 \end{bmatrix}\\ Rx(α)= 10000cosαsinα00sinαcosα00001
R y ( α ) = [ c o s α 0 s i n α 0 0 1 0 0 − s i n α 0 c o s α 0 0 0 0 1 ] R_y(\alpha) = \begin{bmatrix} cos\alpha&0&sin\alpha&0\\ 0&1&0&0\\ -sin\alpha&0&cos\alpha&0\\ 0&0&0&1 \end{bmatrix} Ry(α)= cosα0sinα00100sinα0cosα00001
R z ( α ) = [ c o s α − s i n α 0 0 − s i n α c o s α 0 0 0 0 1 0 0 0 0 1 ] R_z(\alpha) = \begin{bmatrix} cos\alpha&-sin\alpha&0&0\\ -sin\alpha&cos\alpha&0&0\\ 0&0&1&0\\ 0&0&0&1 \end{bmatrix} Rz(α)= cosαsinα00sinαcosα0000100001

注意旋转矩阵 R y ( α ) R_y(\alpha) Ry(α) s i n α sin\alpha sinα的正负号是和另外两个相反的。其实没有反,因为这是一个右手系的坐标轴,绕x轴逆时针旋转的方向是在y0z平面中y轴旋转到z轴的方向,绕z轴旋转的方向是在x0y平面中x轴旋转到y轴的方向,而绕y轴旋转的方向在z0x平面中是从z轴旋转到x轴的方向。以x0y平面的旋转为例: x ′ = x c o s α − y s i n α x' = xcos\alpha - ysin\alpha x=xcosαysinα,即要得到 x ′ x' x需要乘上y轴原始坐标的 − s i n α -sin\alpha sinα。所以在z0x平面内,要得到z轴所在坐标: z ′ = z c o s α − x s i n α z' = zcos\alpha - xsin\alpha z=zcosαxsinα。清晰的记忆方法,以绕x轴旋转为例,绕x轴旋转在y0z平面内是从y轴到z轴的方向, y ′ = y cos ⁡ α − z sin ⁡ α y' = y\cos\alpha - z\sin\alpha y=ycosαzsinα即转离y轴的方向就减,$z’ = z\cos\alpha + y\sin\alpha $ 即朝z轴转的方向就加。

Rodrigues 旋转公式

绕旋转轴 n ⃗ \vec{n} n 旋转角度 α \alpha α

形式一:
R ( n ⃗ , α ) = c o s ( α ) I + ( 1 − c o s ( α ) ) n ⃗ ⋅ n ⃗ T + sin ⁡ α ⋅ [ 0 − n z n y n z 0 − n x − n y n x 0 ] R(\vec{n},\alpha)=cos(\alpha) I + (1-cos(\alpha)) \vec{n}\cdot \vec{n}^T + \sin\alpha\cdot \begin{bmatrix} 0 & -n_z & n_y \\ n_z & 0 & -n_x \\ -n_y & n_x & 0 \\ \end{bmatrix} R(n ,α)=cos(α)I+(1cos(α))n n T+sinα 0nznynz0nxnynx0
形式二:
R ( n ⃗ , α ) = I + sin ⁡ α ⋅ [ 0 − n z n y n z 0 − n x − n y n x 0 ] + ( 1 − c o s ( α ) ) ⋅ [ 0 − n z n y n z 0 − n x − n y n x 0 ] 2 R(\vec{n},\alpha)= I + \sin\alpha\cdot \begin{bmatrix} 0 & -n_z & n_y \\ n_z & 0 & -n_x \\ -n_y & n_x & 0 \\ \end{bmatrix} + (1-cos(\alpha))\cdot{\begin{bmatrix} 0 & -n_z & n_y \\ n_z & 0 & -n_x \\ -n_y & n_x & 0 \\ \end{bmatrix}}^2 R(n ,α)=I+sinα 0nznynz0nxnynx0 +(1cos(α)) 0nznynz0nxnynx0 2

证明:

https://www.cnblogs.com/wtyuan/p/12324495.html

观测变换 (Viewing transformation)

视图变换 (View transformation)

什么是视图变换

想象一下拍照:

  • 首先要找一个好的背景,把人的位置和人与背景的相对位置安排好(模型变换);
  • 然后要找一个好的角度(视图变换);
  • 最后按快门(投影变换)。

定义相机:

  1. 位置向量 Postion: e ⃗ \vec{e} e
  2. 朝向 Look-at direction: g ⃗ \vec{g} g
  3. 相机向上的方向 Up direction (垂直于朝向) : t ⃗ \vec{t} t

在这里插入图片描述

约定:相机永远放在原点,相机永远以+y为向上方向,相机永远朝-z方向看。 也就是进行视图变换时要将所有对象和相机一起做变换,直到相机在原点,朝向-z,以+y为正方向。
在这里插入图片描述

如何将相机从它原来的位置移到约定位置

  1. 平移 e ⃗ \vec{e} e 到原点;
  2. 旋转 g ⃗ \vec{g} g 到 -z 方向;
  3. 旋转 t ⃗ \vec{t} t 到 +y 方向
  4. 旋转 g ⃗ × t ⃗ \vec{g} \times \vec{t} g ×t 到 +x 方向

如何求出将相机旋转到约定位置的旋转矩阵?

先平移到原点:
T v i e w = [ 1 0 0 − x e 0 1 0 − y e 0 0 1 − z e 0 0 0 1 ] T_{view} = \begin{bmatrix} 1 & 0 & 0 & -x_e \\ 0 & 1 & 0 & -y_e \\ 0 & 0 & 1 & -z_e \\ 0 & 0 & 0 & 1 \end{bmatrix} Tview= 100001000010xeyeze1

再考虑它的逆旋转,找到三个特殊向量的旋转,即 x ^ \hat{x} x^ g ^ × t ^ \hat{g} \times \hat{t} g^×t^, y ^ \hat{y} y^ t ^ \hat {t} t^ z ^ \hat{z} z^ − g ^ -\hat{g} g^,就能找到这个逆旋转的旋转矩阵:

R r e v i e w − 1 = [ x g ^ × t ^ x t ^ x − g ^ 0 y g ^ × t ^ y t ^ y − g ^ 0 z g ^ × t ^ z t ^ z − g ^ 0 0 0 0 1 ] R_{review}^{-1} = \begin{bmatrix} x_{\hat{g}\times\hat{t}} & x_{\hat{t}} & x_{-\hat{g}} & 0\\ y_{\hat{g}\times\hat{t}} & y_{\hat{t}} & y_{-\hat{g}} & 0\\ z_{\hat{g}\times\hat{t}} & z_{\hat{t}} & z_{-\hat{g}} & 0\\ 0 & 0 & 0 & 1 \end{bmatrix} Rreview1= xg^×t^yg^×t^zg^×t^0xt^yt^zt^0xg^yg^zg^00001
旋转矩阵是正交矩阵,上面这个矩阵显然符合,旋转矩阵的逆矩阵就是它的转置:
R r e v i e w = [ x g ^ × t ^ y g ^ × t ^ z g ^ × t ^ 0 x t ^ y t ^ z t ^ 0 x − g ^ y − g ^ z − g ^ 0 0 0 0 1 ] R_{review} = \begin{bmatrix} x_{\hat{g}\times\hat{t}} & y_{\hat{g}\times\hat{t}} & z_{\hat{g}\times\hat{t}} & 0 \\ x_{\hat{t}} & y_{\hat{t}} & z_{\hat{t}} & 0 \\ x_{-\hat{g}} & y_{-\hat{g}} & z_{-\hat{g}} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} Rreview= xg^×t^xt^xg^0yg^×t^yt^yg^0zg^×t^zt^zg^00001

总结:将所有对象和相机一起做变换,直到相机在原点,朝向-z,以+y为正方向。

这就是视图变换。

投影变换(Perspective Projection)

正交投影(Orthographic projection)

透视投影(Perspective projection)

区别:正交投影没有近大远小而透视投影有。

在这里插入图片描述

正交投影

做法一:

假设已经进行了视图变换(即相机在原点,朝向-z,以+y为向上方向)

第一步,把所有点的z坐标变为0;

第二步,将得到的二维平面坐标做平移和缩放,让它们装在 [ − 1 , − 1 ] 2 [-1,-1]^2 [1,1]2 这个正方形里。(至于为什么要进行这一步操作,这是一个约定俗成的办法,可以方便之后的操作)

做法二:(正规做法)

实际的计算机图形学操作中,还有一个比简单地把z扔掉更方便的做法:

同样,假设已经进行了视图变换(即相机在原点,朝向-z,以+y为向上方向)

假设此时所有物体装在一个 [ l , r ] × [ b , t ] × [ f , n ] [l, r]\times[b,t] \times [f, n] [l,r]×[b,t]×[f,n] 的长方体内,将这个长方体映射到 [ − 1 , 1 ] 3 [-1, 1]^3 [1,1]3 的正方体:

在这里插入图片描述
先平移,再缩放:
M o r t h o = [ 2 r − l 0 0 0 0 2 t − b 0 0 0 0 2 n − f 0 0 0 0 1 ] [ 1 0 0 − r + l 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ] M_{ortho} = \begin{bmatrix} \frac{2}{r-l} & 0 & 0 & 0 \\ 0 & \frac{2}{t-b} & 0 & 0 \\ 0& 0 & \frac{2}{n-f} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & -\frac{r+l}{2}\\ 0 & 1 & 0 & -\frac{t+b}{2}\\ 0 & 0 & 1 & -\frac{n+f}{2}\\ 0 & 0 & 0 & 1 \end{bmatrix} Mortho= rl20000tb20000nf200001 1000010000102r+l2t+b2n+f1

透视投影

回顾齐次坐标的一个重要性质:

( x , y , z , 1 ) (x,y,z,1) (x,y,z,1)表示一个点,

( k x , k y , k z , k ! = 0 ) (kx,ky,kz,k!=0) (kx,ky,kz,k!=0)也表示该点,

( x z , y z , z 2 , z ! = 0 ) (xz,yz,z^2,z!=0) (xz,yz,z2,z!=0)也表示该点。

做法:

将一个截头锥体,“挤压”到一个长方体:
在这里插入图片描述
如何“挤压”呢?
提前告诉你,这个“挤压”可以用一个矩阵表示,一般叫投影变换矩阵,那么这个矩阵怎么求呢?

观察,该“挤压”的特点:
x坐标和 y坐标很明显有相似关系
在这里插入图片描述
y ′ = n z y ,     x ′ = n z x y' = \frac{n}{z}y,\ \ \ x' = \frac{n}{z}x y=zny,   x=znx
z坐标怎么变目前还不知道,用齐次坐标表示:
[ x y z 1 ] → [ n x / z n y / z u n k n o w n 1 ] = = [ n x n y u n k n o w n z ] \begin{bmatrix} x\\y\\z\\1 \end{bmatrix}\rightarrow \begin{bmatrix} nx/z\\ny/z\\unknown\\1 \end{bmatrix} == \begin{bmatrix} nx\\ny\\unknown\\z \end{bmatrix} xyz1 nx/zny/zunknown1 == nxnyunknownz
这样已经可以得到这个变换矩阵的一大部分了:
M p e r s p → o r t h o = [ n 0 0 0 0 n 0 0 ? ? ? ? 0 0 n 0 ] M_{persp\rightarrow ortho} = \begin{bmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ ? & ? & ? & ?\\ 0 & 0 & n & 0 \end{bmatrix} Mpersportho= n0?00n?000?n00?0

那么该矩阵的第三行怎么求?

利用两点:

  1. 近平面上的点不会发生改变
    [ x y n 1 ] → [ x y n 1 ] = = [ n x n y n 2 n ] \begin{bmatrix} x\\y\\n\\1 \end{bmatrix} \rightarrow \begin{bmatrix} x\\y\\n\\1 \end{bmatrix} == \begin{bmatrix} nx\\ ny\\ n^2\\ n \end{bmatrix} xyn1 xyn1 == nxnyn2n
    因为 n 2 n^2 n2 x x x无关,所以第三行的第一个和第二个元素是0,也就是说对于透视投影矩阵的第三行有:
    [ 0 0 A B ] [ x y n 1 ] = n 2 \begin{bmatrix} 0&0&A&B \end{bmatrix} \begin{bmatrix} x\\y\\n\\1 \end{bmatrix}=n^2 [00AB] xyn1 =n2

  2. 远平面上与z轴相交的点不会改变
    [ 0 0 f 1 ] → [ 0 0 f 1 ] = = [ 0 0 f 2 f ] \begin{bmatrix} 0\\0\\f\\1 \end{bmatrix}\rightarrow \begin{bmatrix} 0\\0\\f\\1 \end{bmatrix}== \begin{bmatrix} 0\\0\\f^2\\f \end{bmatrix} 00f1 00f1 == 00f2f
    也就是:
    [ 0 0 A B ] [ 0 0 f 2 f ] = f 2 \begin{bmatrix} 0 & 0 & A & B \end{bmatrix} \begin{bmatrix} 0\\0\\f^2\\f \end{bmatrix} = f^2 [00AB] 00f2f =f2

可以建立方程组求解A和B了:
A n + B = n 2 A f + B = f 2 An+B=n^2\\ Af+B=f^2 An+B=n2Af+B=f2
解得
A = n + f ,     B = − n f A = n+f,\ \ \ B= -nf A=n+f,   B=nf

得到该矩阵为:
M p e r s p → o r t h o = [ n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 n 0 ] M_{persp\rightarrow ortho} = \begin{bmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ 0 & 0 & n+f & -nf\\ 0 & 0 & n & 0 \end{bmatrix} Mpersportho= n0000n0000n+fn00nf0

最后
M p e r s p = M o r t h o M p e r s p → o r t h o M_{persp} = M_{ortho}M_{persp\rightarrow ortho} Mpersp=MorthoMpersportho

问题:对于截头锥体中间的点,它的z坐标怎么变?

[ n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 n 0 ] [ x y z 1 ] = [ n x n y n z + f z − n f z ] \begin{bmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ 0 & 0 & n+f & -nf\\ 0 & 0 & n & 0 \end{bmatrix} \begin{bmatrix} x\\y\\z\\1 \end{bmatrix}= \begin{bmatrix} nx\\ny\\nz+fz-nf\\z \end{bmatrix} n0000n0000n+fn00nf0 xyz1 = nxnynz+fznfz


f ( z ) = n z + f z − n f z − z = 1 z [ − z 2 + ( n + f ) z − n f ] f(z) = \frac{nz+fz-nf}{z}-z = \frac{1}{z}[-z^2+(n+f)z -nf] f(z)=znz+fznfz=z1[z2+(n+f)znf]
对于中括号中的二次函数,开口向下,且两个零点为z=f和z=n,所以中括号中的二次函数在f<n<z这个区间里大于0,又z<0,所以f(z)小于0,即z的坐标会变小(朝远平面方向变)。

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

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

相关文章

【go】结合一个go开源项目分析谷歌浏览器cookie为什么不安全 附go项目导包失败怎么解决教程

本文创作背景 源于谷歌浏览器提示密码被泄露 并且某站很快收到了异地企图登录的提醒。 当即怀疑是不是谷歌浏览器保存的密码不安全&#xff0c;最后查阅诸多资料 并找到一个go语言编写的开源项目进行研究&#xff0c;虽然最终不能确定密码是如何泄露的 但研究结论还是让人不由感…

在华为MateBook Ego的arm windows 11上安装hyper-V虚拟机

入手一台华为matebook Ego的笔记本&#xff0c;由于想要测试一些arm的驱动功能&#xff0c;经常会把系统搞蓝屏&#xff0c;于是想安装一个虚拟机&#xff0c;于是试了vmware ,visual-box&#xff0c;由于本机是arm架构上面两个软件都无法进行正常安装&#xff0c;可能是由于有…

Excel+SQL实战项目 - 餐饮业日销售情况分析仪

目录1、要完成的任务2、认识数据3、SQL数据加工4、excel形成分析仪1、要完成的任务 目标&#xff1a;结合SQL和excel实现餐饮业日销售情况分析仪&#xff0c;如下表&#xff1a; 认识分析仪&#xff1a; 切片器&#xff1a;店面 分为四部分&#xff1a;KPI 、组合图、饼图、数…

如何自学芯片设计?

众所周知&#xff0c;芯片设计自学还是比较困难的&#xff0c;更不存在速成的。这里简单说一下学习的规划。 学会相应的知识 无论是科班毕业&#xff0c;还是理工科专业&#xff0c;想要入行IC&#xff0c;那就一定要具备相关的基础知识。尤其是在学校里&#xff0c;学习的很…

Centos7 内核升级

一、背景 在 CentOS 使用过程中&#xff0c;高版本的应用环境可能需要更高版本的内核才能支持&#xff0c;所以难免需要升级内核&#xff0c;所以下面将介绍yum和rpm两种升级内核方式。 关于内核种类: kernel-ml——kernel-ml 中的ml是英文【 mainline stable 】的缩写&…

2W字正则表达式基础知识总结,这一篇就够了!!(含前端常用案例,建议收藏)

正则表达式 (Regular Expression&#xff0c;简称 RE 或 regexp ) 是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特殊字符&#xff08;称为"元字符"&#xff09;正则表达式使用单个字符串来描述、匹配一系列匹…

wpscan常见的使用方法

目录 简单介绍 暴力破解 信息收集 指定用户爆破 命令集合 简单介绍 Wordpress是一个以PHP和MySQL为平台的免费自由开源的博客软件和内容管理系统。 WPScan是Kali Linux默认自带的一款漏洞扫描工具&#xff0c;它采用Ruby编写&#xff0c;能够扫描WordPress网站中的多种安…

微信微店怎么开店铺步骤【微信开店】

商家在微信平台主要是通过什么方式进行卖货呢&#xff0c;大家的答案都会是微信小店、小程序微店铺之类的&#xff0c;的确微信店铺是商家在微信平台上重要的卖货渠道&#xff0c;那么微信微店怎么开店铺&#xff0c;下面就给大家分享微信微店怎么开店铺步骤。 一、准备好资料…

Netty启动流程源码剖析

案例 本文利用natty-all-source 包下的的demo案例 echo来分析下源码&#xff0c;代码如下&#xff1a;server 端代码 /*** Echoes back any received data from a client.*/ public final class EchoServer {static final boolean SSL System.getProperty("ssl") …

day14_oop_抽象_接口

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、抽象 三、接口 零、 复习昨日 多态的好处: 扩展性强.加入新的功能,不需要改动代码降低代码耦合度(解耦合或者松耦合) 一、抽象类 1.1 抽象类…

C# VS2010 Winform 学习笔记遇见问题

参考书本《Visual C# .Net程序设计与应用开发》 学习C#&#xff1a; 对象的封装性&#xff1a;通过get()、set()函数读写。 1.Visual C#面向对象编程中的继承、多态。 2.enum&#xff1a;枚举&#xff0c;array.copy方法&#xff1a;数组拷贝&#xff0c;public static voi…

以应用为导向,看声纹识别中的音频伪造问题

声纹识别&#xff0c;又称说话人识别&#xff0c;是根据语音信号中的声纹特征来识别话者身份的过程&#xff0c;也是一种重要的生物认证手段。历经几十年的研究&#xff0c;当前声纹识别系统已取得了令人满意的性能表现&#xff0c;并在安防、司法、金融、家居等诸多领域中完成…

jenkins构建报错:.java:16: error: package javafx.util does not exist

1、报错 jenkins构建报错 package javafx.util does not exist2、报错原因 代码发现使用了javafx类&#xff0c;该类仅存在OracleJDK中&#xff0c;OpenJDK中没有该类。 jenkins服务器安装的是openjdk 3、卸载OpenJDK 具体不概述了 4、离线安装OracleJDK 1&#xff09;…

SPI规范的使用和简介

前言 SPI全称Service Provider Interface&#xff0c;是Java提供的一套用来被第三方实现或者扩展的API&#xff0c;它可以用来启用框架扩展和替换组件。 整体机制图如下&#xff1a; Java SPI 实际上是“基于接口的编程&#xff0b;策略模式&#xff0b;配置文件”组合实现的…

win11/10+opencv3.x/4.x配置 VS2019方法(简单使用,亲测)

首先下载 opencv&#xff0c;去官网下载百度》输入opencv&#xff0c;点击opencv|home&#xff0c;进入官网。点击 “Library”---->Release点击 对应版本下的 window版本&#xff0c;点击 --安装--extract---》设置路径。这个就是把库文件扩展到指定的路径下&#xff0c;扩…

Nacos集群+Nginx负载均衡

搭建Nacos集群 注意: 3个或3个以上Nacos节点才能构成集群。要求服务器内存分配最好大于6G以上&#xff08;如果不够则需修改nacos启动脚本中的默认内存配置&#xff09;根据nacos自带的mysql建库脚本建立对应数据库&#xff08;/conf/nacos-mysql.sql&#xff09;如果是三台服…

KNN&K-means从入门到实战

作者&#xff1a;王同学 来源&#xff1a;投稿 编辑&#xff1a;学姐 1. 基本概念 1.1 KNN k近邻法&#xff08;k-nearest neighbor&#xff0c;k-NN&#xff09;是一种基本分类与回归方法。 k近邻法的输入为实例的特征向量对应于特征空间的点&#xff1b;输出为实例的类别&…

发布新闻的步骤和技巧

发布新闻是一项非常重要的任务&#xff0c;无论是企业还是个人&#xff0c;都可以通过发布新闻来传达信息和宣传自己。以下是发布新闻的步骤和技巧&#xff0c;帮助你成功发布一条新闻。1、确定新闻的目标受众在发布新闻之前&#xff0c;你需要确定新闻的目标受众。你希望这条新…

多元回归分析 | CNN-GRU卷积门控循环单元多输入单输出预测(Matlab完整程序)

多元回归分析 | CNN-GRU卷积门控循环单元多输入单输出预测(Matlab完整程序) 目录 多元回归分析 | CNN-GRU卷积门控循环单元多输入单输出预测(Matlab完整程序)预测结果评价指标基本介绍程序设计参考资料预测结果 评价指标 训练结束: 已完成最大轮数。 训练集平均绝对误差MAE…

vue3+ts项目采用canvas模拟批注功能

vue3ts项目模拟批注 一、项目需求&#xff1a; 移动端&#xff1a;实现点击“批注”&#xff0c;随手指绘制出线条&#xff0c;线条封闭之后&#xff0c;视为圈记成功&#xff0c;进而输入评论内容——批注&#xff1b; 二、实现思路&#xff1a; 1.“批注”按钮控制canvas画…