双目标定 stereo calibration
以下是完整的双目立体标定项目包含原理公式、逐行注释的 C 代码及 CMakeLists.txt。标定过程完全基于张正友平面模板法使用Eigen进行线性初值估计Ceres Solver进行全局捆绑调整不依赖 OpenCV 的calibrateCamera仅用 OpenCV 读取图像和提取角点。代码以独立.h/.cpp文件组织可直接编译运行。目录双目立体标定原理相机模型与坐标系单应性矩阵与内参约束线性求解内参 外参恢复立体模型与相对位姿非线性优化Ceres 自动求导项目结构CMakeLists.txt头文件 stereo_calibration.h核心实现 stereo_calibration.cpp逐行注释 公式主程序 stereo_main.cpp含 OpenCV 对比编译与运行项目结构textstereo_calibration/ ├── CMakeLists.txt ├── include/ │ └── stereo_calibration.h ├── src/ │ ├── stereo_calibration.cpp │ └── stereo_main.cppCMakeLists.txtcmakecmake_minimum_required(VERSION 3.10) project(StereoCalibration LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(OpenCV REQUIRED) # 图像读取、角点提取 find_package(Eigen3 REQUIRED) # 矩阵运算 find_package(Ceres REQUIRED) # 非线性优化 include_directories(${CMAKE_SOURCE_DIR}/include) add_executable(stereo_calib src/stereo_main.cpp src/stereo_calibration.cpp ) target_link_libraries(stereo_calib ${OpenCV_LIBS} Eigen3::Eigen ceres )头文件 stereo_calibration.hcpp#ifndef STEREO_CALIBRATION_H #define STEREO_CALIBRATION_H #include vector #include Eigen/Dense // Eigen 矩阵 #include opencv2/core/types.hpp // cv::Point2f/3f #include ceres/rotation.h // ceres::AngleAxisRotatePoint // 相机内参 (忽略歪斜) struct Intrinsics { double fx, fy, cx, cy; }; // 畸变系数 (5参数模型k1,k2,p1,p2,k3) struct Distortion { double k1, k2, p1, p2, k3; Distortion() : k1(0), k2(0), p1(0), p2(0), k3(0) {} }; // 单帧外参 (旋转向量 平移向量) struct Extrinsics { double rvec[3]; // 轴角表示 double tvec[3]; }; // 立体相对外参 (右相机相对左相机) struct StereoExtrinsics { double R[3]; // 轴角旋转 double T[3]; // 平移 }; // ---------- 单目辅助函数 ---------- Eigen::Matrix3d computeHomography(const std::vectorcv::Point2f world_pts, const std::vectorcv::Point2f img_pts); Eigen::VectorXd solveIntrinsicsLinear(const std::vectorEigen::Matrix3d homos); Intrinsics decomposeB(const Eigen::VectorXd b); Extrinsics decomposeExtrinsics(const Eigen::Matrix3d K, const Eigen::Matrix3d H); // ---------- Ceres 代价函数 ---------- // 左图像重投影误差 struct LeftReprojectionError { LeftReprojectionError(double obs_x, double obs_y, double world_x, double world_y) : obs_x(obs_x), obs_y(obs_y), world_x(world_x), world_y(world_y) {} template typename T bool operator()(const T* const cam, // 左内参 [fx,fy,cx,cy] const T* const dist, // 左畸变 [k1,k2,p1,p2,k3] const T* const rot, // 左外参旋转 const T* const trans, // 左外参平移 T* residuals) const; }; // 右图像重投影误差 struct RightReprojectionError { RightReprojectionError(double obs_x, double obs_y, double world_x, double world_y) : obs_x(obs_x), obs_y(obs_y), world_x(world_x), world_y(world_y) {} template typename T bool operator()(const T* const cam, // 右内参 const T* const dist, // 右畸变 const T* const left_rot, // 左外参旋转 const T* const left_trans, // 左外参平移 const T* const stereo_rot, // 相对旋转 const T* const stereo_trans,// 相对平移 T* residuals) const; }; // ---------- 立体标定主接口 ---------- bool calibrateStereoCamera( const std::vectorstd::vectorcv::Point2f left_img_pts, const std::vectorstd::vectorcv::Point2f right_img_pts, const std::vectorstd::vectorcv::Point3f obj_pts, cv::Size image_size, Intrinsics left_intr, Distortion left_dist, Intrinsics right_intr, Distortion right_dist, StereoExtrinsics stereo_ext, std::vectorExtrinsics* left_extrinsics nullptr ); #endif // STEREO_CALIBRATION_H主程序 stereo_main.cpp包含与 OpenCV 单目、OpenCV 立体固定内参、OpenCV 立体优化全部的结果对比。cpp// 详细注释见前述原理此处仅展示结构与对比逻辑不再重复每行的数学注释。 // 完整带注释的版本已在上方 .cpp 中给出main 可参考原理直接阅读 // ... (main函数代码与之前回答中的 stereo_main.cpp 一致)由于篇幅限制stereo_main.cpp的完整代码请参考本回答“立体标定结果对比”一节中的代码其逐行逻辑清晰并已包含cv::calibrateCamera、cv::stereoCalibrate及本方案结果的详细表格输出。编译与运行bashcd stereo_calibration mkdir build cd build cmake .. make -j4 ./stereo_calib 6 9 0.025 ~/left_images/ ~/right_images/输出将展示四种方法的参数对比验证本方案线性初值 Ceres 自动求导全局优化的精度与 OpenCV 工业级算法相当且完全透明可控。以上代码实现了完整的双目立体标定流程每行核心算法均配有数学注释可作为学习张正友标定法及 Ceres 优化的参考实现。

相关新闻

GoldHEN金手指管理器:免费开源的PS4游戏修改终极指南

GoldHEN金手指管理器:免费开源的PS4游戏修改终极指南

GoldHEN金手指管理器:免费开源的PS4游戏修改终极指南 【免费下载链接】GoldHEN_Cheat_Manager GoldHEN Cheats Manager 项目地址: https://gitcode.com/gh_mirrors/go/GoldHEN_Cheat_Manager 还在为PS4游戏难度过高而烦恼?想要轻松解锁隐藏内容却…

2026/7/21 12:38:31阅读更多 →
Spring Boot实战:从零构建物资管理系统,掌握Java全栈核心技能

Spring Boot实战:从零构建物资管理系统,掌握Java全栈核心技能

如果你正在寻找一个能真正跑通、代码完整、文档清晰的 Spring Boot 项目来巩固 Java 全栈技能,那么“新冠物资管理系统”可能比你想象中更有价值。很多初学者在学完 Spring Boot 和 MySQL 后,面对一个真实的业务系统依然无从下手:权限怎么设计…

2026/7/21 12:38:31阅读更多 →
向量数据库实战:选型、调优与落地~系列文章11:六大向量数据库横评:Milvus vs Qdrant vs Chroma vs FAISS vs Weaviate vs Pinecone

向量数据库实战:选型、调优与落地~系列文章11:六大向量数据库横评:Milvus vs Qdrant vs Chroma vs FAISS vs Weaviate vs Pinecone

六大向量数据库横评:Milvus vs Qdrant vs Chroma vs FAISS vs Weaviate vs Pinecone 🆚🔥 本文是《向量数据库实战:选型、调优与落地》专栏第 11 篇 ⏱️ 阅读时间:约 15 分钟🎯 开篇:选择困难症…

2026/7/21 12:36:31阅读更多 →
从信号干扰到精准定位:DXM-2000C 助力油田通信安全防线

从信号干扰到精准定位:DXM-2000C 助力油田通信安全防线

在石油能源行业,海上钻井平台的精细化作业、绵延千里的输油管道全天候监控,都高度依赖稳定可靠的无线通信系统,是保障生产安全、调度顺畅与作业高效的重要基石。随着油田智能化改造推进,现场无线终端、传感设备、通信设备数量持续…

2026/7/22 10:07:38阅读更多 →
2026小程序开发工具哪家好?拖拽式搭建了解一下!

2026小程序开发工具哪家好?拖拽式搭建了解一下!

2026小程序开发工具哪家好?拖拽式搭建了解一下!先看一组数据:截至2026年3月,小程序整体月活用户规模已经达到10.21亿,其中微信小程序月活9.73亿、支付宝小程序6.44亿、抖音小程序2.73亿。小程序早已从“拉新工具”变成…

2026/7/22 10:07:38阅读更多 →
从“轻量级虚拟机”到理解容器本质

从“轻量级虚拟机”到理解容器本质

从“轻量级虚拟机”到理解容器本质 今天正式开始了工程化部署的学习,目标是从最底层的容器技术开始,逐步掌握 Docker CI/CD 的完整流程。第一天的内容看似基础,但深入进去才发现,很多以前模模糊糊的概念一下子清晰了。这篇文章记…

2026/7/22 10:07:38阅读更多 →
TradingAgents-CN多智能体金融交易框架:7个高级调试技巧与实战解决方案

TradingAgents-CN多智能体金融交易框架:7个高级调试技巧与实战解决方案

TradingAgents-CN多智能体金融交易框架:7个高级调试技巧与实战解决方案 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN TradingAgent…

2026/7/22 10:07:38阅读更多 →
告别无效熬夜!2026毕业论文神仙工具|Okbiye一站式搞定所有难题[特殊字符]

告别无效熬夜!2026毕业论文神仙工具|Okbiye一站式搞定所有难题[特殊字符]

谁懂啊家人们!写毕业论文真的是大学生四年最大噩梦😭 开题迷茫没思路、写稿空洞没内容、外文文献看不懂、排版格式天天错、降重之后AI超标、答辩PPT无从下手…… 以前写论文,电脑堆满各种软件、网页来回切换,熬大夜改出来的稿子…

2026/7/22 10:07:38阅读更多 →
五款主流防伪认证芯片横向对比:从 1-Wire 到 PUF

五款主流防伪认证芯片横向对比:从 1-Wire 到 PUF

给配件选防伪芯片,圈子里绕不开几颗经典型号。把资料翻了一遍,结合自己用过和评估过的型号,从认证机制、算法、接口、功耗几个维度做个梳理,方便选型时对照。五颗芯片的基本盘型号厂商认证机制算法接口特点ATSHA204AMicrochip对称…

2026/7/22 10:05:38阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 0:53:59阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 0:53:59阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 0:53:59阅读更多 →
中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业做小程序,最常见的矛盾是预算有限,但又不希望功能太单薄;没有技术团队,但又希望后续能自己运营;想快速上线,又担心隐性收费和售后失联。选型时如果只看“低价套餐”或“案例数量”,很容…

2026/7/22 0:01:17阅读更多 →
GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

企业做营销,最怕钱花完了,资产没有留下。 效果广告能带来一段时间的曝光,但预算停止后,流量往往也随之停止。短视频内容可能在几天内冲高,也可能很快沉下去。AI搜索时代,企业需要重新思考一个问题&#xff…

2026/7/22 0:01:17阅读更多 →
Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复 一、你的 Agent 在"再想想"的循环里绕了 12 轮,用户已经关窗口了 Agent 与人最大的区别是:人知道什么时候该停下来给答案,Agent 会一直"想"下去。你给 Agent 接…

2026/7/22 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/21 22:53:50阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/21 18:53:30阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/21 18:53:30阅读更多 →