苏小春
摘要:详细研究了在Microsoft Visual C++ 6.0平台下图像采集卡的数据采集以及数据分析,利用Matcom对数据分析结果在VC界面中进行了可视化表达,并利用openCV简捷的图像显示功能对图像数据在VC界面中实现了其动态显示。结合实例,详细介绍了基于Matcom与openCV在VC环境下的混合编程实现途径。结果表明,利用上述混合编程方法可以极大减轻软件编写的工作量,提高软件开发效率。
关键词:VC++;Matcom;openCV;混合编程;数据可视化
中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)05-1086-03
Research of Mixed Programming with Matcom, openCV and VC++ in Data Acquisition and Visualization
SU Xiao-chun
(Quzhou Secondary Technical School, Quzhou 324000, China)
Abstract: In this paper, a detailed research of data acquisition in image acquisition card and data analysis based on Microsoft Visual C++6.0 platform is presented. Visualization expression of the data analysis result and dynamic display to image data is realized with Matcom and openCV in VC interface. Combined with the example, this paper introduces the method and approach of realizing in VC with Matcom and openCV in detail. The results indicate that this method reduces a great deal of software programming work and improve the efficiency of development.
Key words: VC++; Matcom; openCV; mixed programming; data visualization
Matlab是世界上使用最为广泛的数值计算及图形处理软件,但是它具有如下缺点:1)由于Matlab使用行解释方式执行代码,因此它极大的限制了代码执行速度。2)Matlab源程序移植性差,用户必须在安装有Matlab的计算机上才能执行.m文件。3)Matlab执行文件是文本文件,因此算法和数据的保密性不好。4)Matlab对硬件的支持功能非常有限。而Mathworks公司推出的Matcom (目前最高版本4.5)是Matlab到C/C++的编译开发的软件平台,是十分有用的.m文件翻译器,并且它本身就对Matlab的近千个常用数学函数以及绘图函数进行了编译,并将这些函数封装在v4501v.lib库文件中,因此可以方便集成在C/C++的开发平台上。
VC++是Microsoft公司推出的强大的可视化集成编程环境,用它开发的系统具有界面友好、代码效率高和执行速度快以及对硬件SDK的方便支持等优点,但是由于VC++是一通用较底层的编程软件,它不像Matcom那样可以直接调用函数实现矩阵求逆、快速傅里叶变换、曲线拟合等复杂数学运算;另外单一利用VC++实现二维曲线作图也非常复杂,而在Matcom中实现二维曲线绘制则非常简便,只需一条plot命令即可。因此,将Matcom嵌入VC++开发环境混合编程是实现复杂数学运算与数据分析结果可视化表达的有效工具[1-4]。
1999年,英特尔公司在IPL(Image Process Library)基础上在俄罗斯设立的软件开发中心(Software DeveIopment Center)开发了openCV(Open Source Computer Vision Library),目前最新版本是2.1。OpenCV拥有包括300多个C/C++函数的跨平台的中、高层API,提供了很多数字图像处理函数,它不依赖于其它的外部库,直接通过调用openCV算法库,研究人员就可在前人已完成的成熟算法基础上迅速开展自己的工作,因此openCV使单纯用C/C++处理起来很复杂的操作变得非常容易[5-8]。
本文以维视工业相机(MV-1300UM)动态采集显示以及直方图曲线绘制为例,利用Matcom在二维显示方面的独特优势将其用于VC界面上直方图的显示,并采用openCV快速实现其图像动态显示,从而简化VC平台下的数据显示代码,提高编程效率。
1运行环境设置
运行环境设置主要按照以下步骤进行:
1)在Microsoft Visual C++6.0中新建基于对话框的应用程序;
2)安装视频采集卡驱动(本文所采用的相机为维视MV-1300UM黑白CMOS相机,分辨率1280*1024,USB2.0接口),并将提供的SDK开发包内的include文件和lib文件直接复制到新建的应用程序目录下;
3)安装openCV(本文采用版本为openCV1.0),设目录为d:openCV1.0;
4)对于Matcom4.5,本文将直接使用其安装后提供的v4501v.lib库文件以及matlib.h头文件,将这两个文件复制到新建的应用程序目录下;
5)将相机开发包中的四个头文件(HVDAILT.h,HVDef.h,HVUtil.h,Raw2Rgb.h)和库文件(HVDAILT.lib,HVUtil.lib,Raw2Rgb.lib)增加到对话框应用程序工程中;将Matcom4.5的头文件matlib.h和库文件v4501v.lib增加到应用程序工程中;将openCV下相应的头文件目录和库文件目录通过VC++6.0开发平台下的工具>选项>目录增加到搜索目录中;
到此位置,VC++和Matcom4.5以及openCV、硬件驱动SDK的接口准备工作完成,在程序中通过#include相应的头文件即可实现需要的函数调用。
2应用举例
本节以维视USB相机为例,详细讲述其用openCV1.0实现其相机图像采集以及Matcom4.5实现直方图动态显示的步骤。实现步骤具体分为相机初始化、图像采集、图像显示以及直方图计算与显示。
首先在应用程序对话框类中包含以下头文件:
#include "cv.h"// OpenCV头文件
#include "highgui.h"// OpenCV头文件
#include "HVDAILT.h"//相机驱动文件
#include "HVDef.h"//相机驱动文件
#include "HVUtil.h"//相机驱动文件
#include "Raw2Rgb.h"//相机驱动文件
#include "matlib.h"// Matcom头文件
2.1初始化部分
初始化部分主要包括相机初始化以及Matcom初始化,相机初始化主要通过设备开启函数BeginHVDevice,分辨率设置函数HV? SetResolution,采集模式函数HVSetSnapMode,增益控制函数HVAGCControl,视频采集窗口函数HVSetOutputWindow,AD转换等级函数HVADCControl,采集速度函数HVSetSnapSpeed以及曝光时间设置HVAECControl等函数来完成,相机初始化部分我们设置分辨率为全分辨率即1280*1024,为提高采集速度,设置采集图像大小为700*700,其它设置一般按标准方式设置。
相机初始化完成后,需要对Matcom进行初始化。Matcom的初始化只需在OnInitDialog函数下加入一条语句:initM(MAT?
COM_VERSION);
2.2功能实现部分
此部分主要完成图像数据的采集、显示以及直方图绘制,这部分是程序的主体。
2.2.1图像采集与显示
图像采集是通过HVSnapShot函数实现单帧采集,在初始化部分,根据设置的采集图像大小分配了700*700bytes的内存空间,HVSnapShot函数将一帧图像采集到这块内存区域中(设其采集到的内存变量是m_userBuff),然后用openCV的函数来实现其显示。显示部分代码如下:
IplImage* image=cvCreateImageHeader(cvSize(700,700), IPL_DEPTH_8U, 3);
cvSetData(image,m_pseudoColorBuff,700*3);
CDC *pDC=GetDlgItem(IDC_PICTURE)->GetDC();
HDC hdc=pDC->GetSafeHdc();
CRect rect;
GetDlgItem(IDC_PICTURE)->GetClientRect(&rect);
CvvImage cimg;
cvFlip(image, NULL,0); //垂直镜像翻转,与CCD相对应
cimg.CopyOf(image,image->nChannels);
cimg.DrawToHDC(hdc,&rect);
其中IDC_PICTURE是图像控件,此控件的区域用于显示图像。cvSetData是openCV函数,用于将采集到的数据装载到image变量中。采集卡SDK中的ConvertBayer2Rgb函数可用于灰度到伪彩转换。因此m_pseudoColorBuff是对m_userBuff伪彩转换后的数据。
2.2.2图像直方图计算与绘制
图像直方图是统计灰度数据中不同灰度值的个数。因此直方图数据个数为256个,索引号为灰度值,值为相应灰度值的统计总数。
1)图像直方图计算代码如下:
int* hist=(LPINT)malloc(sizeof(int)*256);
memset(hist,0x0,256);
for(int m=0;m<700*700;m++)
for(int n=0;n<256;n++)
if(n==*(m_userBuff+m))
{
*(hist+n)++;
break;
本程序段将700*700的灰度图计算其直方图,将直方图一维矩阵保存在hist变量中。
2)图像直方图显示采用Matcom中的库函数来完成。首先在对话框资源中添加一静态文本框并将ID改名,在OnInitDialog中获取其位置属性(保存在CRect类型的m_ plot变量中),调用Matcom函数初始化绘图区:
mm_h=winaxes(this->m_hWnd);
axesposition(m _plot.left, m _plot.top, m_plot.Width(), m_plot.Height());
xlabel((CL(TM("灰度值"))));
ylabel((CL(TM("统计数"))));
title((CL(TM("直方图"))));
set(mm_h,(CL(TM("Color")),TM("white")));
set(mm_h,(CL(TM("Box")),TM("on")));
grid(TM("On"));
Mm mm_x, mm_y;
x=linspace(0, 255);
y=zeros(1, 256);
mm_plotHandle=plot((CL(mm_x), mm_y, TM("r")));
其中mm_h, mm_plotHandle, mm_x, mm_y是对话框类的成员变量。绘制区域范围设置为静态文本框的范围。
3)直方图绘制中主要分为数据赋值以及曲线绘制,由于直方图数据均为实数,因此需要将数据直接赋给mm_x和mm_y的实部:
for(int i=0;i<256;i++)
{
mm_x.r(i)=i;
mm_y.r(i)=*(hist+i);
}
曲线绘制只需用set函数更新其绘图区即可:
set(mm_plotHandle, TM("xdata"),mm_x);
set(mm_plotHandle, TM("ydata"),mm_y);
通过以上步骤,我们就实现了其图像数据的读入与显示、直方图计算与显示。通过在对话框类中增加WM_TIMER消息,并将图像采集与显示、直方图绘制代码放于WM_TIMER消息处理函数中即可方便的实现其动态显示。
2.3程序退出处理
程序退出部分,包括释放内存块以及关闭图像采集卡和退出Matcom环境,对openCV则无需调用任何函数。程序退出代码如下:
exitM();
HV_VERIFY(EndHVDevice(m_hhv));
该程序已经在Windows XP SP3操作系统,Mocrosoft Visual C++6.0开发平台和openCV1.0以及Matcom4.5上编译通过并正常运行。通过以上步骤,我们实现了从图像采集显示到数据分析显示的完整功能。图1是其程序界面。
图1图像采集显示与直方图曲线绘制程序界面
3结论
详细介绍了VC++、openCV以及matcom接口的实现过程,并以目前工程中常用的硬件采集系统的实例说明采用此种混合编程的详细步骤。结果表明,采用混合编程的方式可以非常方便的适用于目前大多数的数据采集系统的应用程序开发中,其实现方法简单,代码高效,并且程序移植性好。采用VC与openCV以及Matcom的混合编程方法可以让我们从繁复的代码编写工作中解脱出来,使我们能将更多的精力放在数据的复杂处理以及算法的实现上来。提高程序开发效率以及节约时间。
参考文献:
[1]刘维.精通Matoab与C/C++混合程序设计[M].2版.北京:北京航空航天大学出版社,2008.
[2]刘迎,师学明,陈晓玲,等.VC与MATCOM联合编程在数据可视化处理中的应用[J].工程地球物理学报,2007,4(5):455-459.
[3]李宝方,关永,沈孝本,等.基于VC++和Matcom混合编程的函数最佳拟合的确定[J].计算机工程与设计,2007,28(12):2980-2982.
[4]倪静静,王俊璞,金志华,等.利用Matcom和Visual C++实现卡尔曼滤波的新方法[J].计算机应用与软件,2008,5(5):175-176.
[5]于仕琪,刘瑞祯.学习OpenCV(中文版)[M].北京:清华大学出版社,2009.
[6] Landre J.PROGRAMMING WITH INTEL IPP AND INTEL OPENCV[Z].2003.
[7]黎松,平西建,丁益洪.开放源代码的计算机视觉类库OpenCV的应用[J].计算机应用与软件,2005,22(8):134-136.
[8]喻擎苍,翁秀娟,赵匀,等.交互式开放结构计算机视觉平台Ch OpenCV[J].计算机工程与应用,2006(23):78-81.