算法介绍

单目相机三维重建可以使用运动重建Structure from motion(SfM)方法,即由图像生成三维点云以及相机姿态。SfM方法的主要流程如图所示1,第一步,使用同一相机的从不同位置和姿态拍摄需要重建的物体,本实例为了简化后续操作在拍摄被重建物体同时也拍摄了标准标定板,如图2所示,得到原始照片集;第二步,使用MATLAB Camera Calibration Toolbox获得相机参数CameraParams,其中包括了相机的内参矩阵K,相机与标定照片的角度转移矩阵和位置转移矩阵;然后,使用图像分割方法将待重建物体在照片中标记出来并二值化,得到;接下来,选定空间中包含待重建物体的一块区域,使用第二步得到的相相机参数CameraParams,将三维空间利用成像原理重投影到照片坐标中得到重投影坐标;最后,在M中查找与中标记了三维重建物体像素坐标相同的点集,这些点对应的三维点云图就是待重建物体的点云。

算法流程图

包含待重建物体和标准标定板的照片

待重建物体分割效果图

重投影效果图

三维重建效果图2
close all;
clear;
clc;%% 1.Prepare Calibration Images
% Create a cell array of file names of calibration images.
numImages = 11;
files = cell(1, numImages);
for i = 1 : numImageseval(sprintf('files{%d} = ''d%d.jpg'';', i, i));
end% Display one of the calibration images
I = imread(files{1});%% 2.Estimate Camera Parameters% Detect the checkerboard corners in the images.
[imagePoints, boardSize] = detectCheckerboardPoints(files);% Generate the world coordinates of the checkerboard corners in the
% pattern-centric coordinate system, with the upper-left corner at (0,0).
squareSize = 47; % in millimeters
worldPoints = generateCheckerboardPoints(boardSize, squareSize);% Calibrate the camera.
imageSize = [size(I, 1), size(I, 2)];
cameraParams = estimateCameraParameters(imagePoints, worldPoints, ...'ImageSize', imageSize);% load('cameraParams.mat');%% 3.待重建物体分割
label_images = cell(1, numImages);
for i = 1 : numImagesoriginalImage = imread(files{i});originalImage = rgb2hsv(originalImage);originalImage = originalImage(:, :, 2) < 0.35 & ...originalImage(:, :, 3) < 0.15;undistortedImage = undistortImage(originalImage, cameraParams);label_images{i} = undistortedImage;[row, col] = size(label_images{i});% figure(), imshow(label_images{i});% pause(1);
end
%% 4.产生一个长方体点阵框住物体
step = 3;
x1 = -50; x2 = 600;
y1 = -500; y2 = -50;
z1 = -50; z2 = 50;
[x, y, z] = meshgrid(x1: step: x2, y1: step: y2, z1: step: z2);
num_points = length(x(:));
object = [x(:), y(:), z(:), ones(num_points, 1)];%% 5.计算点阵在原图中的投影
flag = zeros(num_points, 1);
K = cameraParams.IntrinsicMatrix;
for j = 1 : numImagesR = cameraParams.RotationMatrices(:,:,j);T = cameraParams.TranslationVectors(j,:);p_uv1 = object * [R;T] * K;s = p_uv1(:,3);p_uv = [p_uv1(:,1)./s, p_uv1(:,2)./s];  % 索引像素时,先行(y)后列(x)p_row = round(p_uv(:,2));p_col = round(p_uv(:,1));err_points = length( find( p_row <=0 ...| p_row>row | p_col <=0 | p_col > col ) );ind = p_row + (p_col-1)*row;ind(find(ind > size(label_images{j}, 1) * size(label_images{j}, 2))) = 1;ind(find(ind < 1)) = 1;flag = flag | label_images{j}(ind) > 0;% 显示投影效果if 1figure;imshow(label_images{j});hold on;indices = find(flag);p_uv_remain = p_uv(indices(1:5:end),:);plot(p_uv_remain(:,1),p_uv_remain(:,2),'r.');hold off;end
end%% 6.重投影效果展示
object = object(flag,:);
figure;
hold on;
[n,~] = size(object);
plot3(object(:,1), object(:,2), -object(:,3),'y.');
axis square;
hold off;
figure; pcshow([object(:,1), object(:,2), -object(:,3)]);
xlabel('x');
ylabel('y');
zlabel('z');
beep;

单目三维运动重建(sfm算法)相关推荐

  1. 【研究报告】从单目深度估计到单目三维场景重建-沈春华老师-VALSE Webinar 22-13(总第279期)

    从单目深度估计到单目三维场景重建-沈春华老师-VALSE Webinar 22-13(总第279期) 报告总结 & 相关论文 论文代码 相关术语 前言 研究问题 单目深度估计 单目三维场景重建 ...

  2. 打开快手,体验流畅的单目三维手势技术

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 近日,快手 Y-Tech 团队研发上线了国内首家端上单目三维手势技术,用户在手机上就能体验到流畅的三维 ...

  3. 万字长文概述单目3D目标检测算法

    一,理论基础-相机与图像 相机将三维世界中的坐标点(单位为米)映射到二维图像平面(单位为像素)的过程能够用一个几何模型进行描述,这个模型有很多种,其中最简单的称为针孔相机模型.相机的成像过程是也一个射 ...

  4. 首个实时单目3D目标检测算法:RTM3D,代码将开源

    o 点击我爱计算机视觉标星,更快获取CVML新技术 基于单目图像的3D目标检测是在输入RGB图像的情况下估计目标的3D包围框,在自动驾驶领域非常有用. 今天来自中科院沈阳自动化所等单位的学者公布论文提 ...

  5. 视频+课件|单目6D姿态估计算法详解

    写在前面 感谢「3D视觉从入门到精通」知识星球嘉宾王谷博士为我们带来的主题为单目6D物体姿态估计算法视频讲解,星球成员可免费观看学习.备注:王谷博士,清华大学自动化系BBNC Lab在读博士生,导师为 ...

  6. 快速单目三维人手和身体的运动捕捉回归与整合

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 1. 论文简要 人体动作的本质细微差别往往是通过肢体动作和手势的结合来传达的,但现有的单目动作捕捉方法 ...

  7. 单目三维目标检测之CaDDN论文阅读

    文章目录 CaDDN: Categorical Depth Distribution Network for Monocular 3D Object Detection 作者和机构信息: Abstra ...

  8. CVPR2020 | 旷视研究院提出PVN3D:基于3D关键点投票网络的单目6DoF位姿估计算法

    IEEE国际计算机视觉与模式识别会议 CVPR 2020 (IEEE Conference on Computer Vision and Pattern Recognition) 将于 6 月 14- ...

  9. 单目车辆3Dbox检测算法对比

    现有的3dBox的检测算法 大部分都是直接回归pose a)将3D模型遍历姿态参数,投影到2D,进行HOG特征匹配: b)将3D模型遍历姿态参数,投影到2D,进行shape匹配: c)CNN直接回归p ...

最新文章

  1. Android实战简易教程-第三十四枪(基于ViewPager和FragmentPagerAdapter实现滑动通用Tab)...
  2. 5G:新基建的压舱石,如何为新基建按下“加速键”?
  3. 听我说说我的博客: 月访问量过万的个人IT博客的技术史
  4. 计蒜客 - Distance on the tree(树链剖分+离线处理+线段树)
  5. linux内核设计与实现 中文第三版 pdf_大牛推荐的5本 Linux 经典必读书
  6. docker 安装ELK
  7. 如何查看linux 是否安装软件包,linux 查看软件包是否安装 linux查看软件包
  8. 同时对view延时执行两个动画时候的现象
  9. path弧形参数 svg_SVG路径中的A指令(画弧线)
  10. SSM整合 mybatis多条件查询与分页
  11. SSO单点登录之同域登录的实现
  12. 红茶一杯话Binder(初始篇)
  13. 300.最长上升子序列
  14. matlab矩阵除法——记忆技巧
  15. 接收灵敏度和等效噪声带宽(ENBW)
  16. java手机号正则验证(中国手机号)
  17. 如何平衡新老策略的好与坏,一道常见风控送命题解答
  18. CLIENT_ACKNOWLEDGE机制测试
  19. 哪些人不适合吃枸杞?
  20. Android入门之简易计算器(一)

热门文章

  1. 2016年兰州交通大学校园选拔赛
  2. [软件需求]软件需求规格说明书样例
  3. 统计之美:人工智能时代的科学思维
  4. limma差异分析谁和谁比很重要吗
  5. 加薪必备,SpringMVC精品面试题(这必须收藏啊!)
  6. EDA技术 一:EDA技术概况及大规模可编程逻辑器件
  7. 立创EDA使用记录——安装、新建工程
  8. 手机壳 套图 软件 imageEn(Delphi实现)
  9. [Linux转载]Linux 操作常用命令
  10. 关于对大一上学期的学习总结及大一下学期的规划。