目录

  • 摘要
  • 一、目标实现功能
  • 二、系统方案
    • 1.硬件
    • 2.软件环境
    • 3.系统流程图
  • 三、具体实现步骤
    • 1.相机拍照控制
    • 2.投影仪控制
    • 3. 界面开发
    • 4.系统标定
    • 5.编码图片生成
    • 6.选定有效区域
    • 7.逐一投影并拍照
    • 8.二值化
    • 9.图片解码并计算出点云(核心步骤)
  • 总结

摘要

本文实现了Matlab环境下的简易的单目结构光三维扫描仪,结构光编码方式格雷码。主要组件:家用投影仪、USB摄像头、个人电脑。单次测量时间36s,点云测量精度为1mm。最终结果以点云形式显示。

一、目标实现功能

使用家用投影仪、USB摄像头、个人电脑实现一个简易的三维扫描仪。外形结构无要求、精度无要求、单次扫描时间无要求。

二、系统方案

系统是由家用投影仪、USB摄像头、个人电脑构成的简易单目结构光三维扫描仪。通过投影仪向物体投射多张结构光图案、摄像头拍摄保存并对拍照图片进行图像处理,最终获得物体表面的深度信息并以点云的形式显示出来。

1.硬件

型号仅供参考啦,基本上常规投影仪摄像头都能用

零件 型号 数量 规格
个人电脑 ASUS A580U 1 -
投影仪 RD-825 1 1920*1080p
摄像头 DYSMT205A 1 1080*768p
HDMI传输线 HD101 1 HDMI2.0

硬件拓扑图

实物图是这样滴············v

2.软件环境

功能 软件
编程 Matlab R2017b(64bit)
GUI Matlab自带的’APP设计工具’
相机标定 Camera Calibration Toolbox
整个系统标定 ProCamCalib工具箱

标定使用的都是Matlab工具箱,后续我会上传到Github

3.系统流程图

三、具体实现步骤

1.相机拍照控制

我使用的摄像头是USB免驱动的,安装工具箱 Image Acquisition tool 就可以通过Matlab工具箱调用了。
具体用法可自行百度、大致如下:

obj=videoinput('winvideo',2);%获取对象
preview(obj);预览
im=getsnapshot(obj)%拍照

2.投影仪控制

投影仪通过HDMI与电脑相连,本来以为Matlab有库函数可以直接对HDMI输出进行控制,结果搜了半天什么也没有。但HDMI插入电脑就可以直接作为第二屏显示桌面,所以我设计的以下3个方案对它进行控制。

  • 方案一:开发Matlab gui程序,通过图窗对图像进行显示。但图片显示总有BUG,且Matlab图窗上面的标题栏去不掉(matlab官网论坛里说的),无法做到图片全屏显示,所以舍弃此方案。
  • 方案二:修改系统壁纸。但很抱歉我在Matlab也没有库函数,So想到Matlab直接调用Window系统API(dll文件)进行修改壁纸,但在调用时出现未知问题。实在没有办法,发现C语言修改壁纸教程网上一大堆,所以通过VS封装了一个DLL文件在Matlab里调用。最终如下两行代码实现了壁纸切换,缺点是切换很慢。1次/s
loadlibrary('dllmain.dll');%matlab调用c写的DLL
calllib('dllmain', 'SetWallpaper', showpath);%calllib(dll文件名称, 函数名, 参数(这里是字符串));
  • 方案三:调用windowHDMI硬件底层接口进行控制,我没确定其可行性也没实现。

3. 界面开发

开发GUI界面的目的为了辅助标定,手动或循环拍照、投影并保存。以便下一步的标定。这个找个教程学下就可以了,源码我后续会上传到Github
界面如下,App设计工具开发的,当当当当

4.系统标定

一切准备好之后就可以进行相机标定了。相机-投影仪系统标定选用张友定标定法,即使标准棋盘纸和投影棋盘共处于标定板平面上,通过拍摄多张不同角度图片,使用Matlab工具箱进行标定,由此得到相机、投影仪的内参数矩阵和投影仪光心坐标系到相机光心坐标系的变换矩阵。

采用ProCamCalib和Camera Calibration Toolbox,具体用法参考其他CSDN博客,多试一试这步问题不大。但有一个坑要提醒一下,注意标定后参数的具体含义,参数具体含义参考工具箱手册,要是还不懂可以看下针孔成像模型原理,里面列举了一个实际的例子。

5.编码图片生成

结构光编码选用格雷码。格雷码对投影图片横纵两方向进行编码,因为选用的投影仪的分辨率位1920*1080,理论上横向像素需11(211>1920)位二进制码进行编码,纵向像素需10(210≈1080)张。但因为制作工艺限制,在单个像素黑白条纹拍摄时会镜头钝化,难以区分边界,所以以4像素为基本单位,故横向编码需要9张图片,纵向需要8张图片。可以用matlab编程生成,但我用VS生成的,因为要设置为壁纸所以格式必须为bmp,命名方式为数字.bmp,具体效果如下:

6.选定有效区域

  • 拍摄空白场景
  • 拍摄有物体的场景
  • 作差并灰度化、二值化得到有效区域
    有效区域后面会用到,以二值化图片的形式保存为area.jpg。

7.逐一投影并拍照

使用上面开发的GUI界面,点击循环拍摄保存进行逐一投影、拍照并且自动保存。结果如下:

8.二值化

二值化图片步骤是对拍摄保存的图片进行二值化处理以提取包含物体表面的轮廓信息的条纹图片。为了消除因为被测物体表面反射率不一致,表面之间互相反射和物体原有纹理的干扰等因素对二值化结果带来的影响,采用Daniel Scharsterin提出的编解码方法。即向物体投射格雷码图案,然后对该图案取反,再将取反后的图案投射到物体表面。设I(x,y)为图像在点(x,y)处的灰度值,I’(x,y)为投射原始格雷码图案时对应的灰度值.如果 I(x,y)> I’(x,y)则认为该坐标处的码值为 0,反之为 1。依次对17对图片进行解码,得到每个区间的编码值。
按照如上方法必须投影34张图片,正反码2张为一组,二值化的结果如下。

im=im(:,:,1);im_=im_(:,:,1);%取红色通道
im_bw=(im>im_).*logical(im_area);%二值化并选取有效区域

9.图片解码并计算出点云(核心步骤)

  • 图片解码的目的是获取每个图片像素点对应的投影图片像素点。
  • 最终即通过内外参数矩阵、畸变系数、像素像素对应关系计算出每一像素点对应世界坐标系中的位置。将每个点进行绘制,得到物体点云(如图)。具体理论推导参考论文[1-4],核心代码和结果如下:
%镜像修正%不然会反xc=768-xc;yc=1024-yc;xp=1080-xp;yp=1920-yp;
%摄像头坐标*内参+去畸变
p1=rect(xc,yc,fc_cam,cc_cam,kc_cam,alpha_c);
%投影仪坐标*内参+去畸变+坐标系变换p2=rect(xp,yp,fc_proj,cc_proj,kc_proj,alpha_c,R_proj,T_proj);
%计算两直线最近点
count=count+1;
Point(1:3,count)=findMinPoint(p1,Oc,p2,Op);function  pos = rect(u,v,f,c,k,alpha,R,T)%图片去畸变——坐标变换A=[f(1) alpha*f(1) c(1);0     f(2)     c(2);0      0         1 ];%内参矩阵k1=k(1);k2=k(2);k3=k(5);p1=k(3);p2=k(4);%畸变参数u=double(u);v=double(v);Z=1;%乘内参矩阵temp=A\[u;v;1];  X=temp(1);   Y=temp(2);r2=X^2+Y^2;%去畸变DX=X*(k1*r2+k2*r2^2)+2*p1*Y+p2*(r2+2*X^2);DY=Y*(k1*r2+k2*r2^2)+2*p2*X+p1*(r2+2*Y^2);X=X-DX;Y=Y-DY;pos=[X;Y;Z];%在需要时进行坐标变换if nargin == 8pos=R\(pos-T);endendfunction  t=findMinPoint(v1,p1,v2,p2)%计算两空间直线最近处中点v1=v1-p1;v2=v2-p2;v1 = v1/norm(v1);v2 = v2/norm(v2);v3 = cross(v1,v2);      %计算和两条直线都平行的平面v3 = v3/norm(v3);t1 = (cross(v3,v2)'*(p2-p1))/(cross(v3,v2)'*v1)*v1 + p1;    %计算过一条直线和v3面垂直的面,计算得到另一条直线和该面的交点。t2 = (cross(v3,v1)'*(p1-p2))/(cross(v3,v1)'*v2)*v2 + p2;    %和上一步类似t=(t1+t2)/2;end

原图点云如下:

总结

整体毕设耗时2个多月,最终实现点云的生成和显示,实现了基础功能,单次测量时间36s,点云测量精度为4mm。此项目还可以进一步优化,比如从投影仪控制上优化单次测量时间、选用格雷码+移相码提高测量精度、也可以后续对点云进行去噪、生成表面等操作或者做个转台多进行表面点云拼接,但我要去肝毕业论文去了 >-<
源码整理好会发出来,第一次认真写博客,欢迎交流指正。


参考文献

[1]杨柳. 单目结构光三维测量精度优化技术研究[D].南京航空航天大学,2017.
[2]白杨. 结构光三维测量图像噪声分析与预处理方法研究[D].郑州大学,2019.
[3]雷震. 单相机单投影仪的编码结构光三维测量方法研究[D].华中科技大学,2015.
[4]李学锋. 双目视觉与编码结构光结合的三维重建技术的研究[D].北京理工大学,2016.

本科毕业设计|简易三维扫描仪相关推荐

  1. 个人计算机技术分享,一个计算机类本科毕业设计分享

    一个计算机类本科毕业设计分享 2021-01-12 东哥毕设 196 0 一个计算机类本科毕业设计分享 一个计算机类本科毕业设计分享,是关于计算机网络技术校园网络公选课的设计和实现,本章主要对该计算机 ...

  2. 基于颜色特征,形状特征和纹理特征的数字图像的检索(Digital Image Retrieval)MATLAB GUI实现(本科毕业设计)

    该程序实现的功能为:检索出指定的图像文件,并从检索出的图像中检索出指定的物体 . 1,主程序为Recognition和Recognition. 2.颜色特征,形状特征,纹理特征为对应的各子程序. 3. ...

  3. qpsk调制解调matlab_本科毕业设计课题—QPSK相干解调的MATLAB仿真(3)

    继续讲解! 给出参考文章! <全数字BPSKQPSK接收机同步技术研究> 模拟中频信号经过模数转换后形成数字中频信号,解调时首先经数字下变频器DDC(digita down-convert ...

  4. 毕业设计开题计算机进度安排表,关于2021届本科毕业设计选题情况及开题时间的通知...

    关于2021届本科毕业设计选题情况及开题时间的通知 计算机教[2021]1 号 各研究所(室.部).各班级: 2021届本科毕业设计选题工作已经完成,现将选题情况进行公布(见附件1,如有问题指导教师联 ...

  5. b-2014四川电子机械职业技术学院计算机科学与技术毕业设计选题,2014届计算机科学与技术专业本科毕业设计(论文)选题指南...

    宁夏师范学院数学与计算机科学学院 2014届计算机科学与技术专业毕业设计(论文)选题指南 一.计算机科学与技术专业的学科领域 计算机科学与技术专业(080605)属于电气信息类专业,电气信息类专业还包 ...

  6. qpsk 锁相环_本科毕业设计课题—QPSK相干解调的MATLAB仿真(4)

    继续看参考资料! 现在常用的数字调制方式有二相移相键控(BPSK).正交移相键控(QPSK).偏移四项移相键控(OQPSK).最小移频键控(MSK)等.它们具有相同的功率效率.BPSK 频谱利用率差, ...

  7. boid模型的Matlab程序,动物集群运动行为模型系列之五-—本科毕业设计.doc

    动物集群运动行为模型系列之五--本科毕业设计 动物集群运动模型 摘要 本文主要模拟了鱼群的集群运动.鱼群躲避捕食者追捕的运动情况以及鸟群觅食运动的模拟,以此研究动物个体间的信息传递机制,同时也是对群体 ...

  8. 计算机本科毕业设计:毕业设计、论文要点及我们面对毕业答辩应持有的态度

    文章目录 前言 一.对于毕业设计 1.1.选题 1.2.中期自查 1.3.毕业设计答辩 二.对于毕业论文 三.我们应持有的态度 3.1.人尽其才 3.2.恪尽职守 3.3.全力以赴 3.4.做好自己 ...

  9. 2007级计算机技术专科毕业设计,2007级计算机科学与技术本科毕业设计选题

    2007级计算机科学与技术本科毕业设计选题 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 毕 业 设 计(论文)任 务 书专业:计算机 ...

  10. 计算机应用设计的目的意义,高等教育自学考试计算机及应用专业+本科毕业设计(论文)的目的与要求...

    高等教育自学考试计算机及应用专业 本科毕业设计(论文)的目的与要求 一.毕业设计(论文)的目的: 1.毕业设计(论文)是本科专业教育的一个重要教学环节,是对学生的实践能力.科研能力.论文写作能力以及论 ...

最新文章

  1. MSSQL 2008里事务的一个问题
  2. 【驱动】linux下I2C驱动架构全面分析
  3. java dubbo 方案,Missing artifact com.alibaba:dubbo:jar:2.8.4 dubbo解决方案
  4. 办公自动化-演练-从A表中提取数据整合到B表中-0223
  5. 队列Queue:任务间的消息读写,安排起来~
  6. 剑指 Offer II 023. 两个链表的第一个重合节点
  7. First of all, let’s talk about the richest man in Japan
  8. html设置长宽高代码_Jenkins CI 自动构建与 CSTAT 代码
  9. 有血有肉,汇报年终总结
  10. 五色电阻在线计算机,五色环电阻阻值在线计算一键生成计算器
  11. 高级英语(张汉熙版)第一册学习笔记(原文及全文翻译)——2 - Hiroshima-The “Liveliest“ City in Japan (excerpts)(广岛——日本“最有活力”的城市)
  12. 谈谈我对面向对象的理解
  13. 原函数的导数与反函数的导数互为倒数
  14. itext7+poi实现excel转pdf
  15. 关于抢红包的_关于抢红包的作文600
  16. 商淘软件WSTMart怎么样
  17. cib.xml for 2resource2group4score
  18. 游戏编程之十一 图像页CPICPAGE介绍
  19. 浅尝辄止MongoDB:GridFS
  20. 张孝祥java高新技术笔记_张孝祥Java高新技术_课程--------学习笔记第一天

热门文章

  1. 在线进位制计算机,2进制换算(十六进制计算器在线)
  2. python sorted方法
  3. 机器学习:概念学习FIND-S算法C++实现
  4. 如果你想专升本那就一定要看的专升本语文_文学常识完整版(四)
  5. golang 实现微信聊天机器人
  6. c语言程序设计第五版第四章例题
  7. 请立刻行动,以免与津津乐道失联
  8. 世界芯中国芯RISC-V相关资源及进展
  9. mac地址被路由器拉黑_我买了一个新路由器,告诉我我被黑了
  10. 【贝尔链创始人Vincent: 区块链不仅是技术革命 更是认知革命】