相机投影过程(码—基于Opencv)
理论知识参考于基于图像的三维重建-针孔相机模型
#include<iostream>
#include<opencv2/imgproc/types_c.h>class Camera
{public://构造函数Camera(){//采用归一化坐标,不考虑图像尺寸c_[0] = c_[1] = 0.0;}//相机投影过程cv::Point2d projection(cv::Point3d const &p3d){cv::Point2d p;//世界坐标系到相机坐标系double xc = R_[0] * p3d.x + R_[1] * p3d.y + R_[2] * p3d.z + t_[0];double yc = R_[3] * p3d.x + R_[4] * p3d.y + R_[5] * p3d.z + t_[1];double zc = R_[6] * p3d.x + R_[7] * p3d.y + R_[8] * p3d.z + t_[2];//相机坐标系到像平面double x = xc / zc;double y = yc / zc;//径向畸变过程double r2 = x * x + y * y;double distort_ratio = 1 + dist_[0] * r2 + dist_[1] * r2*r2;//图像坐标系到屏幕坐标系p.x = f_ * distort_ratio*x + c_[0];p.y = f_ * distort_ratio*y + c_[1];return p;}//相机在世界坐标系中的位置 -R^T*tcv::Point3d pos_in_world(){cv::Point3d pos;pos.x = R_[0] * t_[0] + R_[3] * t_[1] + R_[6] * t_[2];pos.y = R_[1] * t_[0] + R_[4] * t_[1] + R_[7] * t_[2];pos.z = R_[2] * t_[0] + R_[5] * t_[1] + R_[8] * t_[2];return -pos;}//相机在世界坐标系中的方向cv::Point3d dir_in_world(){cv::Point3d dir(R_[6], R_[7], R_[8]);return dir;}public://焦距fdouble f_;//径向畸变系数k1,k2double dist_[2];//中心点坐标u0,v0;double c_[2];//旋转矩阵double R_[9];//平移向量double t_[3];
};int main()
{Camera cam;//旋转矩阵cam.R_[0] = 0.999796; cam.R_[1] = -0.0127375; cam.R_[2] = 0.0156807;cam.R_[3] = 0.0128557; cam.R_[4] = 0.999894; cam.R_[5] = -0.0073718;cam.R_[6] = -0.0155846; cam.R_[7] = 0.00757181; cam.R_[8] = 0.999854;//焦距cam.f_ = 0.920227;// 径向畸变系数cam.dist_[0] = -0.106599; cam.dist_[1] = 0.104385;// 平移向量cam.t_[0] = 0.0814358; cam.t_[1] = 0.937498; cam.t_[2] = -0.0887441;// 三维点坐标cv::Point3d p3d = { 1.36939, -1.17123, 7.04869 };/*计算相机的投影点*/cv::Point2d p2d = cam.projection(p3d);std::cout << "projection coord:\n " << p2d << std::endl;std::cout << "result should be:\n 0.208188 -0.035398\n\n";/*计算相机在世界坐标系中的位置*/cv::Point3d pos = cam.pos_in_world();std::cout << "cam position in world is:\n " << pos << std::endl;std::cout << "result should be: \n -0.0948544 -0.935689 0.0943652\n\n";/*计算相机在世界坐标系中的方向*/cv::Point3d dir = cam.dir_in_world();std::cout << "cam direction in world is:\n " << dir << std::endl;std::cout << "result should be: \n -0.0155846 0.00757181 0.999854\n";return 0;
}
相机投影过程(码—基于Opencv)相关推荐
- 鱼眼相机成像模型以及基于OpenCV标定鱼眼镜头(C++)
opencv系列 文章目录 opencv系列 一.鱼眼镜头模型 二.投影函数 等距投影模型 等立体角投影模型 正交投影模型 体视投影模型 三.OpenCV中的鱼眼相机模型 四.标定(C++)实现 使用 ...
- 纯手码 | 基于OpenCV的车牌识别(Sobel、颜色定位),绝对实用
车牌识别大体上需要经历过Sobel定位.颜色定位.SVM对定位来的候选车牌进行评测,给出评分,最后通过提取HOG特征按照训练模型进入ANN识别. 这一章节介绍 定位相关的逻辑代码,其中定位用到 Sob ...
- OpenCV 相机校正过程中,calibrateCamera函数projectPoints函数的重投影误差的分析
OpenCV 校正过程中,calibrateCamera函数的ret和重投影误差的分析 OpenCV对相机进行校正的过程中,校正返回值retval和重投影误差的计算公式表示和分析. OpenCV 校正 ...
- Python基于OpenCV的图像去雾算法[完整源码&部署教程]
1.图片识别 2.视频展示 [项目分享]Python基于OpenCV的图像去雾算法[完整源码&部署教程]_哔哩哔哩_bilibili 3.算法原理 图像增强算法常见于对图像的亮度.对比度.饱和 ...
- opencv已知相机投影及内参求外参_一步步用c++实现相机标定(张氏标定法)
enazoe/camera_calibration_cppgithub.com 前言 最近在做相机标定方面的工作,虽然以前多次进行相机标定,但是多数时候是调用opencv的函数,过程相对简单.虽然对 ...
- 基于Opencv的车距检测系统(源码&教程)
1.研究背景 对本车前方车辆的识别及距离检测是计算机视觉技术在智能网联汽车中的一个重要内容.要想在错综繁杂的交通环境中实现无人驾驶,对行车环境中其他车辆信息的获取是十分重要的.因此,对本车前方车辆的识 ...
- android opencv 获取小图在大图的坐标_Android开发—基于OpenCV实现相机实时图像识别跟踪...
利用OpenCV实现实时图像识别和图像跟踪 图像识别 什么是图像识别 图像识别,是指利用计算机对图像进行处理.分析和理解,以识别各种不同模式的目标和对像的技术.根据观测到的图像,对其中的物体分辨其类别 ...
- 基于OpenCV实现简单人脸面具、眼镜、胡须、鼻子特效(详细步骤 + 源码)
点击下方卡片,关注"OpenCV与AI深度学习"公众号! 视觉/图像重磅干货,第一时间送达! 导读 本文给大家分享一个基于OpenCV实现简单人脸面具.眼镜.胡须.鼻子特效的实例, ...
- 在Ubuntu中用Qt基于OpenCV调用大恒相机
在Ubuntu中用Qt基于OpenCV调用大恒相机 前言 视觉萌新买了工业相机却不会用,上网也查不到具体方法,没办法只能自己硬刚了.刚开始自己摸索,碰到好多问题解决不了,Qt报错不知道咋回事,缺少的链 ...
最新文章
- Java线程怎样映射到操作系统线程
- 视频|结构光编码与三维重建
- python3 打印完整报错信息 以flask 为例
- Python中datetime类错误
- Machine Learning week 7 quiz: Support Vector Machines
- 深度学习总结:pytorch构建RNN和LSTM,对比原理图加深理解
- 关于ASP.NET动态加载Master页面
- css hack技巧_5种减少Hack的编码技巧
- 欧几里德算法(模板)
- 如何在macOS Monterey 中开启对焦模式?
- 上周四的复盘 | 市场回暖了?割肉吗?
- 游戏业务DDoS攻防对抗案例分享
- Miles to go ... - Arun Gupta: Securing WebSocket using wss and HTTPS/TLS (Tech T
- 获取crumbIssuer
- 《保姆教程一》Idea 必装插件,墙裂推荐!!!
- Dockerhub最新的toomanyrequests问题
- 技术社区、相关论坛推荐汇总(持续更新)
- 虽然惊天地,但不是人人都会哭泣 ——再论Kubernetes惊天地泣鬼神之大Bug
- 云服务器整理(整理中)
- 蒙特卡洛模拟法模拟资产走势以matlab实现