本科毕业设计|简易三维扫描仪


摘要

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

一、目标实现功能

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

二、系统方案

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

1.硬件

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

零件型号数量规格
个人电脑ASUS A580U1-
投影仪RD-82511920*1080p
摄像头DYSMT205A11080*768p
HDMI传输线HD1011HDMI2.0

硬件拓扑图
在这里插入图片描述
实物图是这样滴············v
实物图

2.软件环境

功能软件
编程Matlab R2017b(64bit)
GUIMatlab自带的’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 == 8
                pos=R\(pos-T);
             end
         end
        function  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.

本科毕业设计项目 源码+说明书+PPT】 随着当今时代新型网络技术的迅速兴起,以及第三产业的蓬勃发展,互联网早已成为社会生活当中不可或缺的一部分,而网络安全问题也越来越不容忽视,越来越多的黑客通过利用系统漏洞实施安全攻击、偷盗、诈骗等违法行为,这就需要我们利用先进的技术手段去尽早、准确地检测和解决这些安全漏洞和安全隐患。但是上述这些扫描器一般都属于C/S架构,变更不够灵活,维护与管理的难度较大。当然当前也有很多款网页版扫描器,但大多系统功能较为单一,且缺少对用户的管理和扫描结果的保存和处理,仅支持一次性在线扫描。 针对这一背景,开发了本系统。本系统的特色主要有以下几个方面。 (1)适用于Windows操作系统环境下,采用了B/S架构,用户只需按照要求注册登录即可使用,方便快捷,分布性强,便于维护和管理,可扩展性高。 (2)界面较简单、直观、易操作,对系统用户的专业水平要求不高,便于专业知识储备较少的普通用户接受。并且本系统中增设了仿命令行功能,既可以帮助用户实现对本系统功能的快速了解以及快速使用,也可以调动喜爱命令行的使用者的兴趣。 (3)系统区分了管理员用户和普通用户,管理员用户拥有较多的特权,实现了较简单的基于角色的访问控制,增强了系统安全性和可管理性。 (4)支持用户上传及管理漏洞扫描所用的第三方插件,可以提高漏洞扫描的效率和性能,提高了系统功能的可扩展性。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值