由摄像机的内参K计算视景体——glFrustum的参数推导

OpenGL入门系列- 视景体定义 #include #include #include #include "jitter.h" #define PI_ 3.14159265358979323846 /* accFrustum() * The first 6 arguments are identical to the glFrustum() call. * * pixdx and pixdy a 阅读详情

  http://blog.sina.com.cn/s/blog_4298002e0100e7zx.html



创建视景体的glFrustum函数的形式为: glFrustum(left,right,bottom,top,near,far),前4个参数表示坐标,可正可负,后两个参数表示距离,为正数.大多数OpenGL的参考文献都只是简单的介绍了一下glFrustum的语法和作用,而并不详细介绍该函数的每个参数如何确定.但是,在增强现实中,往往需要把计算出来的内参数矩阵指定给GL,而不能随便设定.那么怎么把内参数矩阵转化为glFrustum的参数,这就是下面要讨论的问题.

    摄像机的内参数矩阵K的形式是:

    由摄像机的内参K计算视景体鈥斺攇lFrustum的参数推导

假设图像的高度和宽度分别为height和width,这里near和far可以任意设定(比如near=100, far=10000).我们用两种方法来推导.

 

(一)几何推导

    如下图,这是视景体的近裁剪面上的顶点在像平面上的投影.

由摄像机的内参K计算视景体鈥斺攇lFrustum的参数推导

图中长为top的线段被映射成长度为v0的线段,而长为-bottom(图中bottom的坐标值为负,加负号才表示长度)的线段被映射成长度为height-v0的线段.根据相似三角形的关系,可以直接得到:

top/v0 = near/fy;

-bottom/(height-v0) = near/fy;

于是得到参数top和bottom的计算公式:

top = v0*near/fy  (1)

bottom = (v0-height)*near/fy  (2)

类似地,从下图可以很容易得到left和right:

由摄像机的内参K计算视景体鈥斺攇lFrustum的参数推导

left = -u0*near/fx  (3)
right = (width-u0)*near/fx  (4)

上面的(1)-(4)式就是从内参数矩阵K计算glFrustum函数的参数的公式.

 

(二)代数推导

    现在我们从代数上来推导这四个公式,以证明其正确性.

    我们知道,在计算机视觉中,内参数矩阵K将摄像机坐标系下的三维点(X,Y,Z)投影到摄像机的像平面上成像,即:

     由摄像机的内参K计算视景体鈥斺攇lFrustum的参数推导

化简得到:

x = fx*X/Z + u0;

y = fy*Y/Z + v0;

GL中所用的摄像机坐标系与计算机视觉中使用的摄像机坐标系不同,正好绕x轴旋转了180度,即y,z两轴反号.所以在GL中,对上式中的YZ取负号,变为:

x = -fx*X/Z + u0;

y = fy*Y/Z + v0;

对于视景体左上角的点,坐标为(left, top, -near),被映射成(0,0,1),所以:

0 = -fx*left/(-near) + u0;

0 = fy*top/(-near) + v0; 即:

left = -u0*near/fx,即为(3)式;

top = v0*near/fy,即为(1)式.

对于视景体右下角的点,坐标为(right, bottom, -near),被映射成(width,height,1),所以:

width = -fx*right/(-near) + u0;

height = fy*bottom/(-near) + v0; 即:

right = (width-u0)*near/fx,即为(4)式;

bottom = (v0-height)*near/fy,即为(2)式.

从上面可以看出,代数方法和几何方法推导出来的公式都一样.

 

综上,从摄像机的内参数矩阵K计算函数glFrustum的参数的公式为:

top = v0*near/fy;

bottom = (v0-height)*near/fy;

left = -u0*near/fx;

right = (width-u0)*near/fx.

反之,如果已知视景体和图像尺寸,也可以由此公式推导出内参数矩阵K.

OpenGL中glFrustum和gluPerspective的相互转换 在上述代码中,我们首先计算了平截头体的高度(height),它等于近裁剪面距离乘以视野角度的正切的两倍。接下来,我们使用计算得到的宽度和高度来计算平截头体的left、right、bottom和top参数,并将它们传递给glFrustum函数来创建透视投影矩阵。这些参数定义了一个平截头体(frustum),决定了场景中可见的范围。而gluPerspective函数也用于创建透视投影矩阵,但它使用的参数是视野角度(fovy)、宽高比(aspect)、近裁剪面距离(near)和远裁剪面距离(far)。 阅读详情

相关推荐

GIS设计与实现:从空间数据建模到WebGIS落地的完整套路

地理信息系统(GIS)是处理空间数据的综合技术,其核心在于空间数据的采集、存储、管理、分析与可视化。理解坐标系与投影、图层组织等基础原理,是确保空间分析结果可靠的前提。GIS的技术价值体现在将复杂空间关系转化为可查询、可分析、可展示的信息服务,广泛应用于智慧园区、城市规划、土地利用监测等场景。从PostgreSQL/PostGIS空间数据库到GeoServer地图服务,再到OpenLayers前端交互,WebGIS已成为主流实现形态。本文围绕GIS设计与实现的完整套路,结合实战经验,讲解从需求分析、空间数据

weixin_34167819的博客 423

OpenGL投影变换:视景体及glFrustum、gluPerspective 与glOrtho、gluOrtho2D

一.            视景体视景体是指成像景物所在空间的集合。它是一个空间集合体。         注意视景体指的是一个空间集合。一般来说,集合中的每个空间都是个立方体。然后所有的这些空间堆在一起,在外侧取一个最大的外接立方体,就是可显示的区域,该可显示区域也是一个视景体。在这个可显示区域内,放置着可以显示的物体。注意,可以显示的物体仅仅是拥有显示权限,但是不一定显示,这取决于相机等其他因素...

超频化石鱼的博客 5388

用WorkBuddy搭建漫剧AI自动化制作流水线全攻略

在内容创作领域,AI智能体正逐渐从单一工具辅助走向全流程自动化调度。其核心原理是将剧本、分镜、绘图、配音、剪辑等环节拆解为可独立执行的任务单元,由总控系统统一协调,从而大幅降低人力与时间成本。这种模式尤其适用于动态漫画(漫剧)这类环节多、专业度要求高的视频形态。传统制作流程中,角色一致性、配音周期和剪辑返工是公认的效率瓶颈,而借助AI智能体工作台,创作者只需输入故事创意,即可驱动多个数字分身协同完成内容生产。本文以WorkBuddy为例,详细展示如何配置模型、安装技能包并串联五段式流水线,将单集制作成本从万

weixin_28224217的博客 251

glFrustum

glm::frustum(-1.0, 1.0, -1.0, 1.0, 1.0, 100.0);与glFrustum (-1.0, 1.0, -1.0, 1.0, 1.0, 100.0);配套使用。前四个是近裁面的矩形坐标,后两个是近裁面与远裁面。

u010607947的博客 1833

SuccessFactors入门篇

SuccessFactors入门篇—— Employee Central(一)最近通过一个月左右的学习,拿到了SF EC(SuccessFactors Employee Central )模块SAP认证,所以打算把自己学习SF的整个过程以及相关资料和大家分享一下,相互切磋,共同进步。Employee Central简单了解Employee Central简单了解新的改变功能快捷键合理的创建标题,有...

qq_42288853的博客 1万+

Prometheus常用配置介绍

除了 scrape_configs 外,上部还有 global 和 rule_files 部分, 其中 global 中 是 全 局 参 数 , scrape_interval 指 定 全 局 默 认 的 时 间 间 隔 , evaluation_interval 指定告警规则校验的时间间隔,rule_files 指定了告警规 则文件的位置名称。• annotations(注释):它们被用于存储更长的其他信息,例如警报描述 或者链接,注释值也可以被模板化。• alert:告警的名称。

weixin_42886699的博客 2259

OpenGL ES之glFrustum函数

名称: glFrustum—— 使用一个透视矩阵乘以当前矩阵 函数原型: void glFrustumf(GLfloat left,  GLfloat right,  GLfloat bottom,  GLfloat top,  GLfloat near,  GLfloat far); void glFrustumx(GLfixed left,  GLfix

飞鱼 1万+

DFT ATPG提升coverage的方法

采用更精确的故障模型,如桥接故障模型(用于描述电路中不应连接的节点之间的短路故障)和路径延迟故障模型(考虑信号在电路路径上的传输延迟),可以使ATPG工具生成更有效的测试向量来覆盖这些特殊故障。假设电路中有一个与门的输入引脚存在固定为0的故障(stuck - at - 0),D - 算法会分析与门的其他输入以及与门输出连接的后续电路逻辑,从而确定整个电路的输入值,使得当该故障存在时,电路的输出与无故障时不同。通过增加测试向量的类型,如功能测试向量和结构测试向量的结合,可以提高故障覆盖率。

Loving_enjoy的博客 967

由摄像机的内参K计算视景体—…

原文地址:由摄像机的内参K计算视景体——glFrustum的参数推导作者:风之忧伤    创建视景体的glFrustum函数的形式为: glFrustum(left,right,bottom,top,near,far),前4个参数表示坐标,可正可负,后两个参数表示距离,为正数.大多数OpenGL的参考文献都只是简单的介绍了一下glFrustum的语法和作用,而并不详细介绍该函数的每个参数如何确定.

胖大星的博客 1325

从CTF到实战:Frida Hook无导出SO函数的3种特殊姿势

本文深入探讨了在移动安全逆向工程中,如何利用Frida Hook无导出SO函数的三种高级技巧:字符串引用定位法、调用栈回溯法和内存特征码扫描。针对安卓So层加固和混淆场景,文章结合CTF赛题与实战案例,详细解析了每种方法的原理、实现步骤与适用场景,为安全研究人员提供了从理论到实践的完整解决方案。

jenkins8butler的博客 516

《UDS/OBD诊断需求编辑工具》总目录

目录 1 基于CANdela Studio编辑CDD诊断描述文件 2 基于ODX Studio编辑ODX/PDX文件 2.1 编辑ODX-D诊断描述文件 2.2 编辑ODX-F刷写软件 该专栏主要负责介绍CANdela Studio和ODX Studio编辑CDD/ODX/PDX诊断描述文件。 1 基于CANdela Studio编辑CDD诊断描述文件 2 基于ODX Studio编辑ODX/PDX文件 【ODX介绍 】-1- 标准梳理 【ODX介绍】 -2-如何手..

「汽车电子助手」的博客 1万+

glOrtho,glFrustum,gluPerspective的理解,很清楚

glOrtho:正交投影,摄像机可以位于裁剪体内,所以near和far可以取两个正值或者一正一负          glFrustum:透视投影,摄像机不可以位于裁剪体内,所以near和far都必须去正值,它的参数矩阵定义了才简体以及投影的类型,但是未定义摄像机的方位。GL 中的摄像机位于原点,并指向了Z轴的负方向。函数glFrustum只是修改了摄像机的 透镜,并非位置,为了改变位置或者朝

Tan_HandSome的博客 6427

基于 Qt C++ 的智能工厂数字孪生系统

你想要实现一个基于 Qt C++ 的智能工厂数字孪生系统,核心是 **Qt 3D** 场景搭建 + **实时数据驱动** 设备模型。下面我将为你提供一个完整的解决方案,包含 **核心思路、实现步骤、完整代码示例** 和 **注意事项**。| **渲染层** | 3D 场景搭建、设备模型加载、实时动画渲染、用户交互。| **业务逻辑层** | 数据处理(滤波、转换)、设备状态管理、动画逻辑控制。| **数据层** | 实时采集设备数据(如传感器、PLC、MES 系统),提供数据接口。

寒寒豆豆软件公司的博客 193

【OpenGL】正投影运用实例

主要代码:GLFrustum::SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin, GLfloat yMax, GLfloat zMin, GLfloat zMax); 创建一个正投影矩阵 // Orthographic.cpp // OpenGL SuperBible // Demonstrates OpenGL Orthographic Projections // Program by Richard S. Wright Jr. ..

两水先木示的博客 785

DSShop移动商城网店系统 反序列化RCE漏洞复现

DSShop单店铺移动商城网店系统的getCartList方法的cart参数存在php反序列化漏洞,攻击者可以通过漏洞执行任意代码,获取服务器权限。

0xSec 1471

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LearnOpenGL - 渲染基础

渲染基础 ©shuan9999 1. OpenGL 渲染架构 架构图: Client:客户端,不同于我们理解的,此处指存储在CPU存储器上,在应用程序上执行或在主系统内存执行的代码。譬如,我们写的C\C++代码。 Server:服务端,同样的也不是我们理解的服务器,而是GPU端,我们写的shader就是在GPU上执行。总的来说我们就是编写程序通过OpenGL库不断将我们的一些数据发送给GPU...

shuan9999的博客 370

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

glOrtho,gluOrtho2D,glFrustum,glViewport解释说明

glOrtho glOrtho函数生成矩阵与当前矩阵相乘 void glOrtho(   GLdoubleleft,   GLdoubleright,   GLdoublebottom,   GLdoubletop,   GLdoublezNear,   GLdoublezFar );   参数 left, right 剪接面左右纵面坐标。 bottom, top 剪

zhouschina的专栏 7182

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

OpenGL 入门纪录--2 .透视函数glFrustum(), gluPerspective()函数用法和glOrtho()函数用法

原文地址::http://hi.baidu.com/zhujianzhai/blog/item/24e9c11ec9a91c64f724e43c.html 在OpenGL中,如果想对模型进行操作,就要对这个模型的状态(当前的矩阵)乘上这个操作对应的一个矩阵. 如果乘以变换矩阵(平移, 缩放, 旋转), 那相乘之后, 模型的位置被变换; 如果乘以投影矩阵(将3D物体投影到2D

xqhrs232的专栏 4329

OpenGL ES之glOrtho和glFrustum的区别

glOrtho和glFrustum的参数是一样的,但是glFrustum的near和far参数都必须是整数并且near不能为0,而glOrtho的near和far参数没有这个限制。二者的left, right, bottom, top表达的意思是相同的,都是指某一切面的坐标位置。         glOrtho表达的是正交矩阵,效果是2D的,就像你正对着一个立方体的某一个面看,所以它没有“近大远

飞鱼 4690

OpenGL之矩阵变换Matrix

简述: OpenGL通过矩阵变换来把三维物体转变为二维图象,进而在屏幕上显示出来。为了指定当前操作的是何种矩阵,使用了函数 glMatrixMode 。 可以移动、旋转观察点或者移动、旋转物体,使用的函数是 glTranslate* 和 glRotate* 。 可以缩放物体,使用的函数是 glScale* 。 可以定义可视空间,这个空间可以是“正投影”的(使用 glOrth

hebbely的博客 3626

OpenGL Es 视角设定(glFrustum)

    OpenGL的视角设定可以直接调用gluPerspective函数,但是OpenGL ES版本并不支持这个用法。ES的版本中只能支持glFrustum的函数调用。一开始不能理解glFrustum函数的用法,经过一番摸索才恍然大悟。    先看函数原型 glFrustum(left,right,bottom,top,near,far);  参数用来确定视角边界的各个点。先看图形   

huihyang的专栏 5175

glFrustum(),glOrtho(),gluPerspective()的实例

opengl 中投影有两种:透视投影 和 正投影 1. 透视投影 :(视景体为棱台,产生的3d图像更具真实感) glFrustum(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far): left , right , bottom , top这四个参数为剪裁面的范围,near

olpf1128的博客 1519

区分glFrustum和gluPerspective

(1) 先说一下glFrustum,当然这两个都是创建视图,都可以达到同样的效果。 函数原型: void glFrustum(GLdouble left,GLdouble Right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far); 先上图,虽然画的很糟糕(图上说明与函数参数相对应,45度是将要得出的广角先不考虑):

C++ OpenGL Ogre 4348

OpenGL glOrtho(left, right, bottom, top, near, far)

glOrtho():正投影相当于在无限远处观察得到的结果,它只是一种理想状态。但对于计算机来说,使用正投影有可能获得更好的运行速度。使用glOrtho函数可以将当前的可视空间设置为正投影空间这个函数的原型为:glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble fa...

hutao1101175783的专栏 1271

摄像机内参矩阵K、基础矩阵F

一.摄像机内参矩阵 摄像机内参矩阵描述的是物体的点与图像点之间的关系。可以将内参矩阵K表示为3*3的矩阵: 内参矩阵K包括5个未知参数。一般情况下,摄像机倾斜因子s=0。因此K就只有4个未知参数了,表示焦距在图像坐标系u轴方向的位置,表示焦距在图像坐标系v轴方向的位置,表示光心在图像坐标系u轴方向的位置,表示光心在图像坐标系v轴方向的位置。 二.基础矩阵 基础矩阵是一个3*3矩阵,表示的是对立图像中对立像点之间的对应关系。用两个摄像机从不同的位置拍摄同一物体,那么两个摄像机的成像平面上会出现一些

摄影爱好者 5846
上一篇: 正则表达式
下一篇: 平行投影与透视投影
Savitch
博客等级 码龄16年 84粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值