相机标定及点云拼接

文章目录

  • 前言
  • 一、相机标定原理
  • 二、关键代码
    • 2.1 相机标定代码1
    • 2.2 相机标定代码2
    • 2.3 点云拼接代码
  • 三、结果展示
  • 总结

前言

在上一篇中已经完成了从图像到点云的转换,但是只针对单个相机,在这一篇中将再进一步,从两个相机拍摄图像,然后做点云的生成及拼接。

一、相机标定原理

相机标定的原理我们上一篇章中也提到了一些(内参矩阵、外参矩阵),而相机标定需要用到的信息包含有内部参数(焦距、光学中心等)、外部参数(旋转、平移矩阵)以及畸变系数。

其中畸变主要指的是径向畸变和切向畸变,径向畸变导致直线呈曲线状,距离图像中心越远,径向失真越大;切向畸变发生是因为摄像透镜没有与成像平面完全平行,图像中的某些区域看起来可能比预期的要近。
在这里插入图片描述
更为详细的原理步骤叙述可以参考:https://blog.csdn.net/lql0716/article/details/71973318。

二、关键代码

2.1 相机标定代码1

因为Azure-Kinect-Sensor-SDK中有提供Kinect标定代码,这里可以直接参考。

这里就简单说一下大致步骤:
(1) 使用相机在近距离、远距离和多个指向角度拍摄标定板图像
运行以下命令以捕获相机0的视频:

k4arecorder --device 0 -c 3072p -d PASSIVE_IR -l 20 ./device0/device0.mkv

运行以下命令以捕获相机1的视频:

k4arecorder --device 1 -c 3072p -d PASSIVE_IR -l 20 ./device1/device1.mkv

(2) 使用ffmpeg获取视频帧:

ffmpeg -i ./device0/device0.mkv -vf fps=1 ./device0/color_%d.jpg
ffmpeg -i ./device1/device1.mkv -vf fps=1 ./device1/color_%d.jpg

(3) 从每个相机拍摄的图像中产生标定文件calib.yaml:

python calibrate.py --dataset-dir ./device0 --template ./PlaneFiles/plane.json
python calibrate.py --dataset-dir ./device1 --template ./PlaneFiles/plane.json

(4) 同时拍摄固定形态的标定板(一个相机一张即可),产生双目标定的信息calibration_blob.json:

python register.py --img-a  <full_path_img_b> --img-b <full_path_img_b> --template ./PlaneFiles/plane.json --calib-a <full_path_calibration_a> --calib-b <full_path_calibration_b> --out-dir <out_dir>

2.2 相机标定代码2

还可以利用Matlab相机标定获取相机的标定信息。

2.3 点云拼接代码

从上一步中可以得到从相机1到相机0的旋转矩阵和平移矩阵(我这里利用的是从Matlab中获取到的标定信息),因此点云根据这两个矩阵进行变换即可,将两个相机的点云数据变换到同一个世界坐标系下。

这里仅供参考的关键代码:

class Reconstruction{
private:vector<Eigen::Isometry3d, Eigen::aligned_allocator<Eigen::Isometry3d>> _poses;//相机标定外参pcl::PointCloud<pcl::PointXYZRGB>::Ptr _pointcloud; //三维重建拼接点云int _camera_num; //相机数目double _cx; //光心double _cy;double _fx; //焦距double _fy; double _depthScale;public://构造函数Reconstruction(){_pointcloud.reset( new pcl::PointCloud<pcl::PointXYZRGB>() );//读取相机内参标定ifstream ifs("../parameter1.txt"); //parameter.txt存储相机内参信息ifs >> _camera_num >> _cx >> _cy >> _fx >> _fy >> _depthScale;ifs.close();//读取相机外参标定ifstream fin("../poses1.txt"); //poses.txt存储的是两个相机的旋转和平移矩阵信息double data[12] = {0};for (int i = 0; i < _camera_num; i++) {for (auto &d:data){fin >> d;}//平移矩阵![请添加图片描述](https://img-blog.csdnimg.cn/e136bb94f133467d82110251da4c64cd.png)Eigen::Vector3d translation( data[0], data[1], data[2]);//旋转矩阵Eigen::Matrix3d rotation_matrix = Eigen::Matrix3d::Identity();rotation_matrix << data[3], data[4], data[5], data[6], data[7], data[8], data[9], data[10], data[11];//构造变换矩阵Eigen::Isometry3d T = Eigen::Isometry3d::Identity();T.rotate( rotation_matrix );T.pretranslate(-rotation_matrix * translation);_poses.push_back( T );cout << _poses.back().matrix() << endl;}fin.close();}//点云生成pcl::PointCloud<pcl::PointXYZRGB>::Ptr ImageToPointcloud(cv::Mat& color, cv::Mat& depth){pcl::PointCloud<pcl::PointXYZRGB>::Ptr pointcloud( new pcl::PointCloud<pcl::PointXYZRGB>() );for (int v = 0; v < depth.rows; v++){for (int u = 0; u < depth.cols; u++){unsigned int d = depth.ptr<unsigned short>(v)[u];pcl::PointXYZRGB point;point.z = double(d) / _depthScale;point.x = (u - _cx) * point.z / _fx;  // _cx, _cy是摄像头光学中心point.y = (v - _cy) * point.z / _fy;  // _fx, _fy是摄像头焦距point.b = color.data[v*color.step+u*color.channels()];point.g = color.data[v*color.step+u*color.channels() + 1];point.r = color.data[v*color.step+u*color.channels() + 2];pointcloud->points.push_back(point);}}pointcloud->height = 1;pointcloud->width = pointcloud->points.size();pointcloud->is_dense = false;return pointcloud;}//点云拼接void pointCloudRegistration(vector<cv::Mat> colorImgs_, vector<cv::Mat> depthImgs_){//读取每个相机的color图和depth图for (int i = 0; i < _camera_num; i++) {cv::Mat color = colorImgs_[i];cv::Mat depth = depthImgs_[i];Eigen::Isometry3d T = _poses[i];pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>());pcl::PointCloud<pcl::PointXYZRGB>::Ptr pointcloud(new pcl::PointCloud<pcl::PointXYZRGB>());cloud = ImageToPointcloud(i, color, depth);pcl::transformPointCloud(*cloud, *pointcloud, T.matrix()); //利用变换矩阵转换点云pcl::io::savePCDFileBinary("../data/camera" + to_string(i) + ".pcd", *pointcloud );*_pointcloud += *pointcloud;}pcl::io::savePCDFileBinary("../data/source_model.pcd", *_pointcloud );}
};

三、结果展示

相机0和相机1的color图:

请添加图片描述 请添加图片描述

相机0和相机1产生的点云:

请添加图片描述 请添加图片描述
拼接后的点云:
请添加图片描述 请添加图片描述

总结

这一篇只是完成了简单的点云拼接操作(其实就是两个点云叠加),最关键的部分还是在相机标定那一块,如何得到标定信息。此外,从拼接的结果来看,拼接后的点云之间还是有缝隙,我尝试标定了好几次,缝隙依然存在,也没有改善。观察Kinect所拍摄的深度图发现,人体的边缘部分存在着黑边,感觉是因为边缘误差太大或者是人体的边缘深度没有探测到,后面再看看怎么改进。因为Azure KInect DK拍摄图片形成的点云比较稠密,后续会用PCL进行处理,顺便学习PCL点云库相关的操作和通用算法。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业微信获取corpid,Secret,Agentid

企业微信获取CORPID&#xff0c;AGENTID&#xff0c;CORPSECRET 在我们对接企业微信时&#xff0c;需要用到以上corpid&#xff0c;Secret 和 Agentid&#xff0c;这些参数的获取方式如下&#xff1a; 1、登录企业微信 https://work.weixin.qq.com/ 2、查询corpid 3、查询agen…

华为消息推送服务(HMS Agent套件)一

出处 1 注册成为开发者 步骤 1 访问华为开发者联盟网站&#xff0c;如图1-1所示。 中文&#xff1a;http://developer.huawei.com/consumer/cn 图1-1 注册入口 步骤 2 点击“注册”按钮&#xff0c;注册成为开发者 &#xff08;要实名认证&#xff0c;上传身份证和人脸…

Android项目中集成华为账号登录、支付

最近项目中集成了华为账号登录与支付的功能&#xff0c;把踩过的坑和过程记录下来。 先看下支付效果图&#xff1a; 支付价格0.01请忽略&#xff0c;因为这是为了测试用的。 刚开始接到这个项目的时候我很奇怪&#xff0c;为什么要集成华为支付呢&#xff0c;原有的微信和支付…

接入华为推送用API给iOS应用发消息时,如何获取access_token?

经常有开发小伙伴向我们提问关于使用华为推送给苹果手机推送消息的问题&#xff0c;那么华为推送到底支不支持苹果手机呢&#xff1f;答案是肯定的。 华为推送服务支持的设备详见下图&#xff1a; 苹果手机如何接入华为推送&#xff1f; 首先需要提前准备好开发环境&#xff…

[个性化设置]win11终端美化

1.开始界面搜索 终端 &#xff0c;右键点击运行框的边框&#xff0c;打开设置 2.点击左下角 打开JSON文件 3. 进入配置文件&#xff0c;下滑找到 defaults 4.在大括号内添加以下代码↓ "backgroundImage": " ", //图片路径 "backgroundImage…

Win11运行安卓超详细教程!芜湖起飞!

一、前提 Windows 11 版本号为 Build 22000.xxx 或更高版本。 您的电脑硬件 BIOS/UEFI 支持虚拟化功能。 二、支持 本教程适用于 Windows 11 正式版和预览版&#xff0c;包括 Dev 频道、Beta 频道和 Release Preview 频道。 本教程适用于搭载 Intel 和 AMD 等处理器的 Windows…

电脑技巧:分享8个Win11系统必备小技巧

目录 1、让任务栏显示“右键菜单” 2、任务栏置顶 3、还原经典右键菜单 4、Win11版任务管理器 5、新版AltTab 6、开始菜单不再卡 7、为Edge浏览器添加云母效果 8、自动切换日/夜模式 Win11在很多地方都做了调整&#xff0c;但由于涉及到诸多旧有习惯&#xff0c;再加上…

如何在工作中利用Prompt高效使用ChatGPT

导读 AI 不是来替代你的&#xff0c;是来帮助你更好工作。用better prompt使用chatgpt&#xff0c;替换搜索引擎&#xff0c;让你了解如何在工作中利用Prompt高效使用ChatGPT。 01背景 现在 GPT 已经开启了人工智能狂潮&#xff0c;不过是IT圈&#xff0c;还是金融圈。 一开…

操作系统:分享Win11几个实用小技巧,赶快收藏吧

目录 1、让任务栏显示“右键菜单” 2、任务栏置顶 3、还原经典右键菜单 4、Win11版任务管理器 5、新版AltTab 6、开始菜单不再卡 7、为Edge浏览器添加云母效果 8、自动切换日/夜模式 Win11在很多地方都做了调整&#xff0c;但由于涉及到诸多旧有习惯&#xff0c;再加上前期Bug的…

【高效开发工具系列】Windows 怎么使用 telnet

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

Windows系统工具MSG的使用,给局域网内的其他电脑发消息

msg 将消息发送给用户。MSG {username | sessionname | sessionid | filename | *}[/SERVER:servername] [/TIME:seconds] [/V] [/W] [message]username 标识指定的用户名。sessionname 会话名。sessionid 会话 ID。filename 识别这样一…

什么是 prompts, completions, tokens and meta-learning /in-context-learning

从字面上看&#xff0c;任何文本都可以用作提示(prompts)——输入一些文本然后得到一些文本。 我们虽然知道 GPT-3 对随机字符串的处理很有趣&#xff0c;但是编写一个有效的提示才能更好的真正的让GPT理解我们要它做什么。 提示&#xff08;prompts&#xff09; Prompt是怎么…

ChatDoctor本地部署应用的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

电信青年员工踏上三千里数字化追梦之旅,数字员工为电信高质量发展注智赋能

导语&#xff1a; 近年来&#xff0c;广西电信紧紧围绕集团战略&#xff0c;聚焦产业数字化发展机遇&#xff0c;加强前瞻性技术研究和人工智能产业应用研究&#xff0c;为夯实高质量发展增添科技动力。 在数字中国建设的大背景下&#xff0c;广西电信全资子公司广西壮族自治区…

AI加速财务智能化,实在智能、优贲财税、楚云科技共探数字员工新未来

作为财务发展的最新前沿&#xff0c;智能财务正在逐步渗入日常工作中&#xff0c;加快企业数字化转型步伐&#xff0c;促进我国财务信息化建设的快速发展。在当前形势下&#xff0c;企业应如何进行数字化转型以重塑业务、财务和税务等关系&#xff0c;形成管理闭环&#xff0c;…

AI安全03:如何监督AI

前言 菜鸟入门中~请ChatGPT老师继续上文讨论的话题&#xff1a;如果AI监督AI&#xff0c;甚至AI攻击AI&#xff0c;那么人类应该为AI的行为设置哪些监控措施&#xff1f; 写在前面&#xff1a; 1 以下讨论均针对自然语言模型~ 2 是个菜鸟的空想&#xff0c;肯定会有说错的地…

卡塔尔世界杯起航了

卡塔尔世界杯&#xff0c;从申请成功之初&#xff0c;就充满了争议&#xff0c;卡塔尔夏天最低温度是35度&#xff0c;经过协调&#xff0c;挪到了冬天举行&#xff0c;但这正是欧洲各国联赛最忙的时候&#xff0c;导致很多球员不得不一周双赛&#xff0c;调整空间有限&#xf…

【我爱世界杯】伪球迷眼里的世界杯

大家好&#xff0c;我是【架构师李肯】&#xff0c;一个专注于嵌入式物联网架构设计的攻城狮。 文章目录 按理说聊一聊我和足球第一次热衷于关注世界杯后ying情时代的卡塔尔世界杯祝愿世界杯 按理说 嗯&#xff0c;按理说&#xff0c;我一个程序猿&#xff0c;既不踢球&#x…

卡塔尔世界杯︱足球游戏的打开方式

距离卡塔尔世界杯开始还有一周的时间&#xff0c;你为此做好什么准备了吗&#xff1f; 一些狂热的球迷为了追求极致的观感和身临其境感&#xff0c;不惜在电视、音响上下重金&#xff1b;也有一些为了享受世界杯热闹氛围的人&#xff0c;囤好零食&#xff0c;或是和好友早早约…

世界杯数据清单:真球迷看球必备,伪球迷速成指南(附数据amp;论文)

来源&#xff1a;大数据 本文共5583字&#xff0c;建议阅读10分钟。 本文基于数据从球队、球员、比赛三个方面与你聊世界杯的热门知识与冷知识&#xff0c;全面解读2018世界杯。 [ 导读 ]每隔4年都有那么1个月&#xff0c;无论是线上还是线下&#xff0c;不管是真球迷还是真球盲…