首页 百科知识 基于MATLAB与VC++混合编程的路面构造深度检测的研究

基于MATLAB与VC++混合编程的路面构造深度检测的研究

时间:2024-09-17 百科知识 版权反馈
【摘要】:2 MATLAB与VC++混合编程Visual C++是Mi-crosoft公司推出的强大的面向对象的可视化编程环境,具有界面友好、代码效率高和执行速度快等优点,可以完成从底层软件直到面向用户软件等各种应用程序的开发。

刘 祝

(长安大学信息学院,陕西西安 710064)

作者简介:刘 祝(1983-),男,长安大学信息学院硕士研究生,信息与通信工程专业。

摘 要:针对MATLAB与VC++编程语言各自的优点,通过调用MATLAB*.m函数编译后的动态链接库的混合编程方法,利用线激光对路面进行扫描,同时由3D相机对变形的激光进行拍摄,再由三角法计算三维深度信息,实现对路面构造深度的三维重构,完成对路面构造深度的检测,最后,进行可脱离环境的程序发布。

关键词:MATLAB与VC++混合编程;构造深度;激光扫描;三维重构

Abstract:Since MATLAB and the VC++programming language both possess their respective advantages,use the method of mixed programming which call dynamic link library compiled MATLAB*.m,than scan the road surface by laser,at the same time,photograph the deformation laser by the 3Dcamera,according to the principles of trigonometry easily calculate the 3D depth information,after three-dimensional reconstruction of pavement texture depth,complete the detection of pavement tex-ture depth,finally can release the program in an separated environment.

Key words:MATLAB and the VC++mixed programming;texture depth;Laser scanning;three-dimensional reconstruction

1 引 言

在公路民用科技快速发展的今天,利用信息技术完成对公路路面质量的客观、准确并且高速的检测,从而对其进行功能、结构性能、结构承载力以及安全性能等方面的综合分析和评价,逐渐成为一种必然趋势,也是必不可少的手段。同时构造深度作为一个非常重要的路面特性,成为了决定路面抗滑性能和行车安全的最重要的一个因素。因此如何获取并分析构造深度,成为研究公路路面质量的一个重要方面,本文主要致力于利用MATLAB与VC++混合编程,通过三维重构模型的技术,以数字图像技术为基础,对路面构造深度进行检测研究。

2 MATLAB与VC++混合编程

Visual C++(以下简称VC++)是Mi-crosoft公司推出的强大的面向对象的可视化编程环境,具有界面友好、代码效率高和执行速度快等优点,可以完成从底层软件直到面向用户软件等各种应用程序的开发。利用它提供的各种实用工具,开发者可以轻松开发出高效强大的Win-dows应用程序。然而VC++只提供了一些基本的数学函数库,当遇到复杂的数值运算时,通过编程人员实现代码,将大大延长软件的开发周期,增加软件开发成本,影响软件的性能。

MATLAB是由Math Works公司推出的一套性能很高的数值运算和可视化软件,可以进行数据处理、数值计算、图形显示、系统分析甚至符号运算功能,然而MATLAB语言是一种解释执行的脚本语言,执行效率低,不能脱离其环境运行,界面开发能力较差,MATLAB编写的.M文件是文本文件,容易被直接读取,难以保护劳动者的成果。

由此而提出的MATLAB与VC++混合编程,通过两者有机的结合,便能很好的发挥两种语言各自的优点,提高软件开发效率,使开发的软件具有更高的性能,更广阔的应用领域。

3 路面构造深度的三维重构技术的原理

3.1 三维重建

三维重建是指通过一定的方法,采集物体集合表面的点,并通过这些点,建立物体的点云。可以通过插补的方法使这些点形成物体的几何表面,模型的精确性也与点云的密集程度成正比。三维重建技术构造出的立体几何图形是从二维图像出发并且更加具有真实感,给进一步的组合运算和场景变化奠定基础,从而促进图像和三维图形技术的广泛的应用。

3.2 构造深度

构造深度也称纹理深度,是衡量路面粗糙度的重要指标,指在路表面一定面积内凹凸不平的开口孔隙的平均深度。路面检测的一项重要内容就是路面构造深度,通过测定沥青路面或水泥混凝土路面表面的构造深度,可以对路面表面的宏观粗糙度、排水性能、抗滑性能进行评定,分析和评价路面的综合性能。采用数字图像技术,从路面的数字图像中提取出相关特征的参数信息,可建立图像特征信息与构造深度之间的关联,从而得到路面的构造深度。

3.3 路面构造深度的三维重构的整体思路

3.3.1 设计思路

本次研究的设计思路是利用线激光器,将线激光照射在沥青路面上,再用3D相机拍摄路面上变形的激光线条,然后根据激光三角算法,计算出路面的三维深度信息,最后将三维深度转化成路面的构造深度,其基本构造如图1所示。

图1 线激光构造深度视觉数据获取系统模型

具体运行过程,首先是利用激光光源,就是利用透镜扩大线激光器发射出的激光光束后,照射在沥青道路表面上,这样就会在沥青路面上形成一条激光线,并且此激光线会随着路面的高低起伏形状不断的变化,经过向前的位移,这些激光线就组成了和被测路面形状一致的三维条纹图像,同时利用另一位置的3D相机对该三维条纹图像进行拍摄,从而获得光栅条纹的二维变形条纹图像,二维条纹图像的条纹变形程度取决于路面轮廓以及光学投射器与3D相机之间的相对位置。对二维图像的条纹进行计算分析,就可以得到路面的凹凸情况,进而计算出路面的构造深度。

3.3.2 工作流程

线激光路面构造深度检测系统主要包括:电源子系统、路面图像采集子系统、图像数据处理系统、构造深度计算系统和报表子系统等。其中路面图像数据采集子系统又包括独立的线激光光源、高速工业相机、轮距仪等。其工作流程如图2所示。

图2 线激光路面构造深度检测仪系统工作流程图

3.4 构造深度的计算机三维重构

每次测试点会采集到多幅连续激光线图像,每幅图像都经过上述的图像处理中质心提取与断点拟合后,并通过激光三角法计算可获得该图像中的激光线对应位置的一组真实高度值,最终获得的数据是只包含该处测量点的所有的高度信息。经过近一步转换得到构造深度。

对路面进行三维扫描,获取路面构造的三维坐标数据。扫描前先对Ranger相机进行标定,以获取到准确的路面构造深度数据。扫描完成后,与相机相连的计算机运行程序对路面三维数据进行处理,处理完成后,程序会生成一个包含路面三维高度信息的dat格式的文件,以及与之相对应的xml文件。每次测量都会对应一组dat文件和xml文件,其中dat文件存放的是路面的高度信息,而xml文件则详细给出了对应dat文件中存储数据的格式、数据量等信息。采集得到的数据传送到计算机中,用特定的程序对其进行分析、处理,最终完成路面三维模型的重构。

4 路面构造深度的三维重构的实现

完成扫描并获取路面三维高度信息文件以后,需要运用程序实现路面表面的三维可视化,以便让人能够直观感受路面的实际纹理构造,并为后期的构造深度的计算提供精确的坐标位置信息。由于后期需要提取并编程计算路面的构造深度,而MATLAB具有强大的编程计算功能,比较适合于后期路面构造深度的提取计算,因此本课题选用MATLAB作为路面构造处理软件。

4.1 MATLAB与VC++混合编程的实现方法

MATLAB与VC++混合编程的实现方法有以下四种:

1.生成可独立运行的MATLAB程序:调用MATLAB程序编译为可独立执行程序,通过修改接口文件的方式实现在C++程序中调用MATLAB文件。

2.调用MATLAB引擎:通过MATLAB引擎直接执行MATLAB语言,不能脱离MAT-LAB环境。

3.调用MATLAB*.m函数编译后的动态链接库:将MATLAB程序编译为C++动态链接库,然后在C++程序中调用,可以使MAT-LAB程序脱离MATLAB环境执行。

4.调用MATLAB生成的COM组件:利用MATCOM第三方软件将M函数和M脚本文件转化为C/C++文件,转化之后的文件支持MATLAB图形功能,转化过程简单,可脱离MATLAB环境执行。

4.2 实现过程

下面具体介绍实现过程:MATLAB软件自带的编译器,可以将.m文件翻译成各种不同类型的源代码,其中要用到mcc命令。mcc命令的行包含很多参数,配置不同的参数可实现不同的功能。

4.2.1 MATLAB的环境配置

编译器在编译调用了C\C++库函数,就需要使用mex-setup和mbuild-setup对编译环境进行配置。其中mex-setup和mbuild-setup是自动搜索系统上安装的编译器,然后核对所选择的选项,Matlab的环境配置设置一次即可。

4.2.2 编译Matlab文件

编译绘制三维立体曲面的M文件函数,文件名为Display.m。核心代码如下:

fid=fopen('2014-4-9-2.dat','r');

k=6144;

y=zeros(1000,1536);

fori=1:1:1000

fseek(fid,k,'cof');

x=fread(fid,1536,'float32');

y(i,:)=x;

end

fclose(fid);

mesh(y);

colormap jet

shadinginterp

light('Position',[-1-11]);

lightingphong;

material dull;

view(30,25);

grid on;

rotate3don;

title('三维显示');

hidden off

return;

利用mcc命令在MATLAB环境下将Dis-play.m转换为C/C++代码,同时提供图形数据库的支持。命令:mcc-C-W cpplib:Displaylib-TLink:lib Display.m。编译运行后能够得到所需的.hpp文件及其对应的.cpp文件。针对本例中所生成的.h、.dll文件和.lib、.ctf文件夹,要将其拷贝到新建的VC++工程文件中。

4.2.3 VC++环境设置

首先,新建一个MFCApp Wizard(exe)应用程序,打开该工程,点开菜单Project/Add To Project/Files……将以上生成的.cpp文件添加到当前工程中。选择菜单Tools,点击Options,在Options页中选择Directories,添加库文件和头文件的存储路径。在Show directories for下拉框中选择Include files,添加路径:E:\MAT-LAB6p5\extern\include,E:\MATLAB6p5\extern\include\cpp,在下拉框中再选择Library files,添加路径:E:\MATLAB6p5\extern\lib\win32,E:\MATLAB6p5\extern\lib\win32\microsoft\msvc60。

选择菜单Project,选项Settings,选择Link属性页,在Category下拉菜单中选择Input。在Ob-ject\library modules文本框中添加libmx.lib、libm-wsglm.lib、sgl.lib、libmatpm.Lib、libmmfile.lib、lib-matlb.lib、libmat.lib、libmwservices.lib、libeng.lib,添加的时候用空格隔开。在下侧的Ignore libraries文本框中添加msvcrt.lib。

在属性页中,打开C/C++选项,在Use Run-time Library的下拉列表中选择Debug Mul-tithreaded DLL,在Category下拉框中选择Code Generation;然后,在Category下拉框中选择Au-tomatic use of precompiled headers,同时选择Precompiled Headers,在C/C++属性页上,Cat-egory下拉框中选择General,在Preprocessor definitions编辑框中添加IBMPC、MSWIND、MSVC,并用空格隔开;同样,在Through headers编辑框中输入stdafx.h。

完成以上步骤后,就需要把之前所有的.hpp文件在新建的VC++工程中添加为头文件。在程序中用mw Array对MATLAB中调用的参数进行定义并赋值

这样,就在Visual Studio2008中实现对编译过的Matlab代码的调用,在整个系统软件中完成对路面的三维显示,实现效果如图3、图4所示。

图3 路面三维重构示例1

图4 路面三维重构示例2

5 程序发布

程序员由于对程序发布的不够重视导致出现许多问题,在MATLAB与VC++混合编程中尤为显著,因为是跨环境编程,因而发布程序时所需要的东西更为复杂,程序员需加以注意。

最简洁的用户程序发布是利用配置工具的打包工具实现,这种方法可以生成完整的安装文件,非常适用于用户使用。

某些情况下,用户需要自己定制程序发布的过程,此时用户需要了解MATLAB编译程序发布的细节,即用户发布程序时需要两部分:MCRInstaller.exe和目标文件以及目标文件执行相关的附加文件。本此研究中需要的文件有以下几部分:

1)MCRInstaller.exe程序:位于<matlabro-ot>\toolbox\compiler\deploy\win32目录下。

2)动态链接库文件:包括.ctf文件,.dll文件,.lib文件,.h文件,是MATLAB编译器编译的目标文件

3)可执行文件:.exe文件。

4)其他与可执行文件相关的附加文件。

6 结语

混合编程是利用不同开发工具共同开发,充分发挥各自的技术优势的一种开发方法,本文是利用VC++和Matlab,进行集成开发,一方面使代码更加的精炼,并且也提高了运行效率,从而更好地实现了对路面三维模型的重构及效果显示。

7 致谢

感谢老师在实验中给我的指导和帮助,是他们教会了我专业知识,教会了我如何学习,教会了我如何做人。正是由于他们,我才能在各方面取得显著的进步,在此向他们表示我由衷的谢意,并祝所有的老师培养出越来越多的优秀人才,桃李满天下

参考文献

[1] 张明,叶巧玲,冯晓.路面平整度检测技术现状与发展[J].重庆交通大学学报,2007,26(4):112-116.

[2] 刘琬辰,黄晓明.基于图像处理的沥青路面构造深度评价方法的优化研究[J].北方交通,2013(3):9-13.

[3] 郑晓光,徐健,丛林等.沥青路面均匀区域构造深度的预估模型[J].建筑材料学报,2007,10(6):653-656.

[4] Maher I.Rajab.Profiling of External Deformation in Asphalt Pavement Rutting using Image Analysis Method[J]. Signal Processing and its Applications(CSPA),2013:99-102.

[5] 马荣贵.路面三维检测系统原理及方法研究[D].西安:长安大学,2008.

[6] ZHOU Zhong-liang,YING Jia-ju.Study on Image Processing Technology in Imaging Laser Detection System[J]. Photonics and Optoelectronic(SOPO),2010:1-4.

[7] 崔凤奎,宋战波,王晓强,等.三维表面粗糙度激光三角法测量原理研究[J].矿山机械,2010,38(14):30-33.

[8] Joäo Guilherme D.M.Franáa,Mário A.Gazziro,Alessandro N.Ide,JoséH.Saito.A 3DSCANNING SYSTEM BASED ON LASER TRIANGULATION AND VARIABLE FIELD OF VIEW[J].Image Processing,2005.

[9] 万瑾,黄元庆.激光三角法测量的研究[J].三明学院学报,2006,23(4):361-364.

[10]李文煜.VC与Matlab混合编程实现图像处理[J].计算机仿真,2005,22(1):254-257.

[11]王海岗,张坤宇,张雁佳,等.VC与MATLAB混合编程在图像处理中的应用[J].计算机应用与软件,2012,29(1):273-275.

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈