news 2026/10/7 2:49:06

stixel_world中CoordinateTransform结构体公式推导

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
stixel_world中CoordinateTransform结构体公式推导

根据之前的文篇,可以得到相关的公式

像素坐标系相机坐标系自车ego坐标系世界坐标系

双目立体视觉视差推导与 StereoRectify 算法原理报告

坐标系旋转推导和符号约定

针孔相机视差相似三角形推导

stixel-world柱状物检测公式推导

Slanted-Stixels柱状物斜坡检测公式推导

双目视差计算深度推导

Slanted Stixels 与坡路拟合:原理与工程实现详解

Stixel World 原理深度解析报告

来自 https://github.com/gishi523/stixel-world/blob/master/stixel_world.cpp#L20-L52

// Transformation between pixel coordinate and world coordinate /** * 像素 (行号 v + 视差 d) ↔ 世界 (高度 Y + 前方距离 Z) 的双向换算。 * * 坐标系约定(工程内统一): * Y : 从相机光心向下的垂直距离,向下为正 [m],路面在 Y = +camera.height * Z : 沿水平路面向前的距离 [m] * θ = camera.tilt : 相机下俯角(光轴相对水平面向下倾斜),下俯为正 [rad] * v : 图像行号,向下增大;v0 主点行;视差 d [px] * * 核心几何(绕 x 轴转 θ,世界 → 相机系): * z_cam = Y·sinθ + Z·cosθ // 沿光轴的深度 * y_cam = Y·cosθ − Z·sinθ // 图像纵向分量(垂直于光轴) * 成像:v − v0 = fv·y_cam/z_cam ; d = baseline·fu / z_cam * 联立反解 → toY/toZ;顺序代入 → toV/toD */ struct CoordinateTransform { CoordinateTransform(const CameraParameters& camera) : camera(camera) { // 预计算 sin/cos,避免每个像素重复算三角函数 sinTilt = (sinf(camera.tilt)); cosTilt = (cosf(camera.tilt)); // B = baseline·fu/fv:打包常数,使 B/d = z_cam/fv。 // 视差→深度用 fu(水平焦距),像素→角度用 fv(垂直焦距), // 二者不等时原版公式(假设 fu==fv)会失真,B 把比例合进一个数。 B = camera.baseline * camera.fu / camera.fv; } // (d, v) → Y:该像素的世界高度(向下为正)。 // 路面像素 d = roadDisp[v] 算出来应 ≈ camera.height。 // 推导:Y = z_cam·(sinθ + (v−v0)·cosθ/fv) = (B/d)·((v−v0)·cosθ + fv·sinθ) inline float toY(float d, int v) const { return (B / d) * ((v - camera.v0) * cosTilt + camera.fv * sinTilt); } // (d, v) → Z:该像素的前方距离。 // 推导:Z = z_cam·(cosθ − (v−v0)·sinθ/fv) = (B/d)·(fv·cosθ − (v−v0)·sinθ) inline float toZ(float d, int v) const { return (B / d) * (camera.fv * cosTilt - (v - camera.v0) * sinTilt); } // (Y, Z) → v:世界点投回图像行号。 // 例:FreeSpace 里 YT = YB − objectHeight 后再 toV, // 就是"路面以上 objectHeight 米的障碍物顶在哪一行"。 inline float toV(float Y, float Z) const { return camera.fv * (Y * cosTilt - Z * sinTilt) / (Y * sinTilt + Z * cosTilt) + camera.v0; } // (Y, Z) → d:该世界点应有的视差。 // 例:HeightSegmentation 的 deltaD = dB − toD(YB, ZB + deltaZ), // 比较"同高、远 deltaZ 米"处的视差差,决定像素属于物体还是地面。 inline float toD(float Y, float Z) const { return camera.baseline * camera.fu / (Y * sinTilt + Z * cosTilt); } CameraParameters camera; // 一份参数拷贝(仅几个 float) float sinTilt, cosTilt, B; // 预计算的三角函数与打包常数 };

Y c a m = Y c o s θ − Z ∙ s i n θ Y_{cam}=Ycosθ−Z∙sinθYcam​=Ycosθ−Z∙sinθ①Z c a m = Y s i n θ + Z ∙ c o s θ Z_{cam}=Ysinθ+Z∙cosθZcam​=Ysinθ+Z∙cosθ②

联立①和②,可得③④

Y = Z c a m s i n θ + Y c a m c o s θ Y=Z_{cam}sinθ+Y_{cam}cosθY=Zcam​sinθ+Ycam​cosθ③Z = Z c a m c o s θ − Y c a m s i n θ Z=Z_{cam}cosθ−Y_{cam}sinθZ=Zcam​cosθ−Ycam​sinθ④

空间点投影到图像行:v = v 0 + f v Y c a m Z c a m v=v_0+\frac{f_vY_{cam}}{Z_{cam}}v=v0​+Zcam​fv​Ycam​​⑤ ,相似三角形

视差d = b f u Z c a m d=\frac{bf_u}{Z_{cam}}d=Zcam​bfu​​⑥ ,联立⑤⑥得Z c a m = b f u d Z_{cam}=\frac{bf_u}{d}Zcam​=dbfu​​⑨

Y c a m = b f u f v v − v 0 d Y_{cam}=\frac{bf_u}{f_v}\frac{v-v_0}{d}Ycam​=fv​bfu​​dv−v0​​⑩

将⑨⑩代入③④,得Y = b f u f v 1 d [ ( v − v 0 ) c o s θ + f v s i n θ ] Y=\frac{bf_u}{f_v}\frac{1}{d}[(v−v_0)cosθ+f_vsinθ]Y=fv​bfu​​d1​[(v−v0​)cosθ+fv​sinθ]

Z = b f u f v 1 d [ f v c o s θ − ( v − v 0 ) s i n θ ] Z=\frac{bf_u}{f_v}\frac{1}{d}[f_vcosθ−(v−v_0)sinθ]Z=fv​bfu​​d1​[fv​cosθ−(v−v0​)sinθ]

①②代入⑤⑥求出v和d

v = f v Y c o s θ − Z ∙ s i n θ Y s i n θ + Z ∙ c o s θ + v 0 v=f_v\frac{Ycosθ−Z∙sinθ}{Ysinθ+Z∙cosθ}+v_0v=fv​Ysinθ+Z∙cosθYcosθ−Z∙sinθ​+v0​

d = b f u Y s i n θ + Z ∙ c o s θ d=\frac{bf_u}{Ysinθ+Z∙cosθ}d=Ysinθ+Z∙cosθbfu​​

需要注意到:B = camera.baseline * camera.fu / camera.fv;,也就是B = b f u f v B = \frac{bf_u}{f_v}B=fv​bfu​​

其中,Y = b f u f v 1 d [ ( v − v 0 ) c o s θ + f v s i n θ ] Y=\frac{bf_u}{f_v}\frac{1}{d}[(v−v_0)cosθ+f_vsinθ]Y=fv​bfu​​d1​[(v−v0​)cosθ+fv​sinθ]是toY函数,return (B / d) * ((v - camera.v0) * cosTilt + camera.fv * sinTilt);

Z = b f u f v 1 d [ f v c o s θ − ( v − v 0 ) s i n θ ] Z=\frac{bf_u}{f_v}\frac{1}{d}[f_vcosθ−(v−v_0)sinθ]Z=fv​bfu​​d1​[fv​cosθ−(v−v0​)sinθ]是toZ函数,return (B / d) * (camera.fv * cosTilt - (v - camera.v0) * sinTilt);

v = f v Y c o s θ − Z ∙ s i n θ Y s i n θ + Z ∙ c o s θ + v 0 v=f_v\frac{Ycosθ−Z∙sinθ}{Ysinθ+Z∙cosθ}+v_0v=fv​Ysinθ+Z∙cosθYcosθ−Z∙sinθ​+v0​是toV函数,return camera.fv * (Y * cosTilt - Z * sinTilt) / (Y * sinTilt + Z * cosTilt) + camera.v0;

d = b f u Y s i n θ + Z ∙ c o s θ d=\frac{bf_u}{Ysinθ+Z∙cosθ}d=Ysinθ+Z∙cosθbfu​​是toD函数,return camera.baseline * camera.fu / (Y * sinTilt + Z * cosTilt);

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/7 2:47:20

代码活化石:版本判断如何安全拆除与预防

你打开任何一个有点年头的项目&#xff0c;大概率都能在某个角落翻到一行if (version < 1.0)或者if (version > "2.0")这样的判断。乍一看莫名其妙&#xff0c;为什么要判断一个几乎没有变化的常量&#xff1f;写得稍微讲究点的&#xff0c;旁边还会配一行注释…

作者头像 李华
网站建设 2026/10/7 2:46:23

【leetcode】(九)哈希函数与哈希表

(一)哈希函数和哈希表的实现认识哈希函数和哈希表的实现1.哈希函数的定义f(in)out(1)in->∞,out->s.比如md5算法输出的范围是0~2^64-1,SHA1算法的输入范围是0~2^128-1;(2)same in ->same out.不随机(3)dif in ->same out.(哈希碰撞)(4)均匀分布,散列表.固定区域的点…

作者头像 李华
网站建设 2026/10/7 2:46:21

重学网工之-ftp、telnet服务配置

任务1&#xff1a;在R2上开启FTP服务 要求&#xff1a;账号&#xff1a;ftptest 密码&#xff1a;1234 设置下载路径 登录等级为3级配置命令&#xff1a; [AR2]aaa [AR2-aaa]local-user ftptest password cipher 1234 #设置FTPtest的账号密码 [AR2-aaa]local-user ftptest serv…

作者头像 李华
网站建设 2026/10/7 2:46:20

Linux磁盘空间排查实战:从du原理到定位文件占用

生产服务器告警&#xff0c;磁盘占用率95%&#xff0c;作为运维或者后端开发&#xff0c;第一反应肯定是查清楚哪个目录吃掉了空间。这时候Linux的du命令是绕不开的基础工具。du全称disk usage&#xff0c;用来统计文件和目录在磁盘上的实际占用情况。别看命令本身很简单&#…

作者头像 李华
网站建设 2026/10/7 2:44:41

Windows下让jar包双击直接运行:注册表文件关联修复指南

你有没有遇到过这样的情况&#xff1a;同事发来一个打包好的 jar 包&#xff0c;你双击&#xff0c;屏幕要么弹出 WinRAR 的解压窗口&#xff0c;要么鼠标转了一圈就没了反应。其实大多数时候不是电脑坏了&#xff0c;也不是 Java 没装好&#xff0c;而是 Windows 压根没把.jar…

作者头像 李华