摘要:提出了一种基于VC++和LabVIEW的线阵CCD位移信号检测系统, 将VC++的代码执行高效性和LabVIEW程序开发的便捷性、友好的图形化界面相结合, 实现了线阵CCD位移信号边采集边处理, 保证了信号采集的实时性和信号处理的高效性.其中VC++实现了信号的采集、存储, LabVIEW实现了信号的分析、处理和显示.
关键词:线阵CCD; VC++; TXT文本文件; LabVIEW; 二值化;
Abstract:This paper introduces a system for acquisition of signal on CCD based on VC++ and LabVIEW. High efficiency of VC++ and convenience of LabVIEW and afriendly graphical interface are combined to achieve concurrence of real time sampling and real time processing. VC++ realized sampling, storing, while LabVIEW realized analyzing, processing and display.
Keyword:line CCD; VC++; text file; LabVIEW; binarization;
VC++和Lab VIEW都可用于信号的采集和分析, 是虚拟仪器的两个典型的代表[1-3].Visual C++ (以下简称VC++) 是微软推出的可视化集成开发环境, 基于传统的文本语言编程方式, 开发的应用程序代码执行效率高, 它提供的MFC基础类库和ATL活动模板类也可以自由地设计用户界面及控件, 但由于它更侧重较底层的开发, 所以开发起来有一定难度.Lab VIEW是目前最为成功、应用最为广泛的虚拟仪器软件开发环境, 它采用图形化G语言编程, 具有丰富的函数、数值分析、信号处理等功能, 开发周期短、效率高[4-5].
本文结合了这两种虚拟仪器的优点, 将其应用到线阵CCD位移信号的检测.利用VC++代码执行的高效性, 实现线阵CCD的信号采集, 并将采集到的信号写入文本文件, 再利用Lab VIEW友好的界面和强大的分析功能对采集到的图像信号进行分析和处理, 实现了VC++和Lab VIEW在位移信号检测上的混合编程, 这样的处理方法能够实现实时的位移信号检测.
1、系统硬件总体结构
系统的光源是采用西安思拓公司的光强均布激光器, 该产品是采用非球面透镜, 改善了光强非均匀分布的特性, 使光强呈均匀分布, 适用于高精度的测量和测试.CCD采用东芝公司的TCD1501D, 具有5 000个有效的像素点.采集卡是天津耀辉公司生产的AD12S-USB采集卡.
系统硬件平台流程图如图1所示:光源1发出的光经凸透镜2后形成平行光, 通过调整高度游标卡尺3的高度对该平行光进行遮挡, 遮挡后的光线通过凸透镜4会聚成像进入CCD, CCD将光信号转换成电信号后, 由采集卡采集并传输至PC机.
图1 硬件平台流程图
2、系统软件设计流程
系统软件的总体设计流程如图2所示.CCD将光信号转换成电信号后, VC++通过采集卡采集线阵CCD的信号, 并将采集到的信号写入PC机硬盘的TXT文件, Lab VIEW通过读取该TXT文件, 对该信号进行时域、频域、幅值域等各种分析, 最终对该位移信号进行显示, 实现了信号的边采集和边处理.
图2 软件设计流程图
3、VC++程序设计
3.1、VC++程序设计流程
AD12S-USB采集卡出厂时提供了由VC++编写的动态链接程序dllkxusb.dll, 用VC++的Depends工具打开该库函数可以得到7个函数的名称和程序入口, 如图3所示, 函数功能及描述如表1所示.
图3 dllkxusb.dll动态库子函数
表1 dllkxusb.dll动态库子函数
本文中只调用了其中的5个函数, 流程图和采集卡主控面板如图4~5所示.系统上电后先查询采集卡, 查询到的采集卡会显示在图6内的采集卡选择框内, 没有查询到采集卡则提示没有发现采集卡, 选择好采集卡的型号后, 输入采集卡的通道数、采集卡的精度位数、CCD的像元数后打开采集卡, 点击设置采集卡按钮对采集卡进行参数设置, 然后打开指定存储采集数据的TXT文件, 采集信号并写入TXT文件, 当采集完一帧图像后, 关闭TXT文件, 进行下一步的循环操作.
图4 VC++信号采集流程图
图5 VC++信号采集控制面板
3.2、VC++程序设计说明
1) 查询采集卡.
如果n Device Sum<=0, 则图5的采集卡选择的下拉列表框内提示没有可用设备, 否则会显示查询到所有的采集卡型号, 程序如下:
2) 采集卡参数输入和打开采集卡.
在输入采集卡的通道数、采集卡的精度位数、CCD的像元数后, 点击打开采集卡的按钮, 触发VC++的按钮控件, 实现3个参数的赋值和取得设备的句柄, 在这里m_h Ccd Device是设备的句柄, 是对这块采集卡的唯一识别, 在以后的函数调用中, 只有取得这个设备的句柄才能对这个设备进行操作, 程序如下:
3) 设置采集卡.
将各个参数赋值后, 就调用lc Set CCDParam函数对采集卡进行设置, 程序如下:
4) 循环采集和存储.
设置好采集卡参数后, 打开所要存储信号数据的文本文件路径, 然后调用采集卡采集函数进行采集并写入TXT文本文件, 采集一帧图像后关闭TXT文件, 循环操作, 程序如下:
4、Lab VIEW程序设计
4.1、Lab VIEW程序设计流程
Lab VIEW的程序设计流程图如图6所示.首先Lab VIEW读入存有信号数据的文本文件, 将其转化成数组, 再采用低通滤波滤掉噪声, 利用二值法对线阵CCD检测到的位移图像进行分割, 再通过计算移动像元数得到位移输出.
4.2、Lab VIEW程序设计说明
Lab VIEW程序主要包括前面板、框图程序和图标/连接端口3部分.前面板是交互式图形化用户界面, 用于设置输人数值和观察输出量;框图是定义vi功能的图形化源代码, 利用图形化语言对前面板的控制量和指示量进行控制, 这里简称后面板;图标/连接端口用于把程序定义成一个子程序, 以便在其他程序中加以调用[6-9].
1) 打开TXT文件.
首先进入Lab VIEW后面板, 从右键菜单选中编程/文件I/O/读取文本文件, 然后进行文本文件的路径设置.
图6 Lab VIEW信号处理流程图
2) 转化成数组.
从文本文件输入的信号数值通过调用LabVIEW带有的Extract Numbers.vi子模板转换为数组, 如果采集卡设置只有一个通道, 转换后的数组就是一维数组, 如果是设置两通道, 那么就是两维数组, 本系统选择一个通道.
3) 低通滤波.
CCD在采集图像过程中由于各种原因总是存在图像的退化、干扰和噪声, 比如CCD积分时间不足, CCD的抖动等, 所以要进行滤波[10].而在信号的传输过程中经常会混入高频噪声, 噪声的能量甚至会超过信号能量, 所以这里选择低通滤波[11-13], 把原始的信号通过傅里叶变换后如图7所示, 可以看出噪声的信号分布在低频段, 所以这里选择低通滤波器的截止频率为5 Hz, 滤波阶数设置为3阶, 滤波前后效果如图8所示.
图7 傅里叶变换
4) 二值法.
由Lab VIEW采集到CCD的位移信号, 横坐标表示CCD的像元, 纵坐标表示每个像元所对应的光强信号.由Lab VIEW的统计子模块Mean MedianMode.vi计算出滤波后图像光强的平均值, 再和一个常数相乘得出的积作为图像二值化的阈值, 这里常数选择0.8, 这么做的好处是实现了自适应阈值, 这个阈值随着光强的改变而改变, 将通过滤波后的图像和阈值相比较, 有些像元的光强大于阈值, 有些小于阈值, 调用公式模块并设置符号公式Sign (X) , 就可以将光强信号分开, 这就是图像二值化的过程, 通过虚拟示波器显示出来, 如图9所示.
图8 滤波前后图像
图9 二值化图像
5) 位移输出.
通过For循环语句对所有的像元光强信号进行索引循环, 并设置条件语句进行正负的判断就可以将信号分成正负两组信号, 分别求出这两组信号中光强正负的像元数.得到了像元数后, 再和光学成像的放大倍数相乘[14], 就可以求出物体的位移量.光学成像的放大倍数计算如图10所示.
图10中, x1是高度游标卡尺的移动距离, x2是CCD成像暗斑的移动距离, 本系统的CCD采用东芝的TCD1501D, 每个像元的中心距离是14 um, 假设CCD成像暗斑的像元数为n, 则可以得到公式 (1) , 通过公式 (1) 就可以算出物体的移动距离.
图10 光学成像放大倍数
6) Lab VIEW界面.
本系统的Lab VIEW框图程序如图11所示, 前面板如图12所示.
图11 Lab VIEW框图程序
图12 Lab VIEW前面板
5、结语
通过VC++和Lab VIEW在线阵CCD上的混合应用设计了一个简单的位移信号检测系统, 将VC++的代码执行高效性和Lab VIEW友好的图形界面结合起来, 实验结果表明系统能够实现VC++边采集信号, Lab VIEW边对该信号进行分析和处理, 实现了CCD位移信号的实时检测.
参考文献
[1]刘锐宁, 宋坤.Visual C++程序设计标准教程[M].北京:人民邮电出版社, 2009.
[2]杨乐平, 李海涛, 杨磊.LabVIEW程序设计与应用[M].2版.北京:电子工业出版社, 2005.
[3]叶鹏飞.MATLAB与VC++混合编程在系统辨识中的应用[J].电脑开发与应用, 2009, 22 (1) :66-67.
[4]岂兴明, 周建兴, 矫津毅.LabVIEW 8.2中文版入门与典型实例[M].北京:人民邮电出版社, 2009.
[5]张建宏.虚拟仪器技术及其应用前景[J].电力学报, 2007, 22 (3) :355.
[6]程学庆, 房晓溪.LabVIEW图形化编程与实例应用[M].北京:中国铁道出版社, 2005.
[7]宋长源.基于LabVIEW软件的信号采集与分析[J].河南科技学院学报, 2008, 36 (1) :117-117.
[8]蔡国英, 张宏群.基于LabVIEW的信号产生与分析系统[J].理论与方法, 2007, 26 (7) :12-14.
[9]石川, 张琳娜, 刘武发.基于LabVIEW的数据采集与信号处理系统的设计[J].机械设计与制造, 2009 (5) :21-23.
[10]王庆有.光电传感器应用技术[M].北京:机械工业出版社, 2007.
[11]杨乐平, 李海涛, 赵勇, 等.LabVIEW高级程序设计[M].北京:清华大学出版社, 2003.
[12]Wolfe J.Fast median filter implementation[J].SPIE, 1979, 207:154-164.
[13]项震.基于器件特征的图像噪声消除[J].光电工程, 2001, 28 (5) :66-68.
[14]吴晓红, 王中林.光学工程基础[M].武汉:湖北科学技术出版社, 2008.