第一部分 Levin M/VGA 系列采集卡简介
Levin-M/VGA 50/100/170/205高精度图象采集卡是北京微视新纪元科技有限公司基于美国新型PCI接口芯片组自主研制开发的图象采集高新产品。Levin-M50/100/170/205为是基于PCI总线的黑白/彩色分量图像高速、高分辩图象采集卡,可采集各种标准和非标准的摄像机和信号源,适用于高精度、高分辨率的图像处理(各种常用VGA信号)医学图像设备(如X光机、ECT、高线CT等)。
第 1 页
1. 1主要性能指标
输入可为标准或非标准视频信号,可准实时
单路黑白视频信号(M系列)和分量RGB信
号(VGA系列)。
自带帧存,三路高速8位A/D。分辨率最大
可达 2048×2048×8x3。
最大点频可达205M,可采集的VGA 最大分
辨模式为1600x1200,75场。
采样频率连续可调。保证在不同的行频和帧
频下获得方形或任意比例的矩形采样点阵。
具有独立可自动调节带宽的抗混叠滤波器。
亮度和对比度可独立调节。
1.2 硬件工作环境
微视Levin系列高精度图象采集卡可使用Intel815E/VIA/BX各种芯片组的主板,如:微星、磐英、华硕、大众、科技嘉等电脑主板以及市面上各种品牌的PC机和工控机。
北京微视新纪元科技有限Levin系列板卡运行最低环境:
第 2 页
CPU:PIII550以上,内存:128M SDRAM,TNT2 AGP 显卡。
系统接地:一般来说,所有大型设备,如医疗设备、雷达、电子显微镜等,由于具有单独的电源系统,相应的图象采集处理系统,要特别注意系统的接地即共地连接,以避免设备损坏及视频信号的辐射。这是因为很多大型设备都可能有不同程度的漏电,这种漏电虽然内阻很大,但电压可达几百伏,如果这么高电压的漏电因未共地而流入图象采集卡的输入端,或其它设备的端口,就可能烧坏设备。最简单的做法是:在设备互相连接和通电之前,一定要先将装有图象采集卡的计算机外壳与大型设备的接地点(设备的外壳也可以)用较粗的铜线牢靠地连接起来,大型设备的接地点一定要按电工标准通到大地。
第 3 页
第二部分 Levin系列产品安装
2.1系统要求
1. 电脑主板需真正符合PCI
2.2之界定标准规程;
2. 请选用奔腾级CPU的PC机,以更好地发挥图像卡
性能;
3. 请阅读您的图像卡说明,区别选用32位VGA显示
卡;
4. 更好的动态视频效果需要∶内存≥128MB;显存
≥4MB;
5. 需要20M以上硬盘剩余空间,以便安装设备驱动、
正常运行程序、保证Windows正常运行;
6. 机内正确预装Win2000/WindowsXP系统;
7. 保证电脑没有被病毒感染!并请检查系统设备管理,
如:有无其它视频捕获产品及驱动程序、系统中断有
无冲突、是否正确安装了显示卡的原厂驱动程序…
任何时刻,请勿带电拔插操作!尤其是视频源输入输出连接线,如需拔插时请关断任何一端的电源,以免损坏。
2.2安装指南
2.2.1 安装步骤
1.关闭计算机,打开机箱盖,选择适用的PCI插槽,插入
第 4 页
LevinM/VGA系列卡。
2.按照系统提示安装驱动程序,(mvvga.inf)。
启动计算机,系统应报告发现新硬件,出现图5窗口。
图5 发现新硬件窗口
单击“下一步”,出现图6窗口。
图6 搜索驱动窗口
单击“下一步”,出现图7窗口。
第 5 页
图7搜索驱动路径窗口
选定“指定位置”复选框,然后在文本框内输入驱动程序所在路径,
单击“下一步”,出现图8窗口。
第 6 页
图8 驱动程序提示窗口
单击“下一步”,出现图9窗口。
图9 驱动程序安装窗口
单击“完成”,系统将自动完成余下的安装过程。安装完毕,在设备管理器中会出现M系列卡的标识,如图10所示。
图10 驱动程序安装后的设备管理器
之后可以运行范例程序,使用Levin系列采集卡的基本功能。
第 7 页
2.2.2 注意事项
显示卡设置:
使用Levin-VGA时要将系统的显示颜色设置为32位彩色。使用M50/M100/M170/M205时要系统的显示颜色设置为24、32位彩色。
2.3安装注意事项
(一) 确保驱动程序正确安装
(二) 查看windows目录下mvvga.ini文件
(三) 查看mvvga.ini文件属性,注意不能为只读文件。
(四) 如在使用过程中还有其他问题请与北京微视新纪元科技有限公
司技术部联系。
2 .4 应用开发说明
2.4.1 用户须知
驱动程序采用C语言编制。编程接口符合微视通用开发接口的规范。动态连接库为MVAPI.DLL,对应静态连接库为MVAPI.LIB。相应的头文件为函数定义文件mvapi.h和常量定义文件common.h、mvboard1.h。如果用户采用Delphi,VB等环境开发应用程序,我们提供相应的单元和模块文件。
2.4.2 开发环境
北京微视新纪元科技有限Levin-VGA/M卡提供完整的开发环境,以SDK(DLL)动态库方式提供。
一、软件开发合作方式:
第 8 页
1、免费:驱动程序、应用演示程序、开发手册指南;购买日起
30天的免费技术开发支持
2、有偿:含上述全部内容,并以SDK(DLL)动态库的方式提供
实用程序的全部源代码。建立合作关系并长期提供技术开发
支持服务。
二、微视开发包功能:
·硬件初始化;
·采集、实时显示控制;
·图象数据存盘;
·视频信号分量亮度、对比度调整;
自动侦测视频信号;
第 9 页
第三部分编程指南
VGA/M系列卡编程使用的函数如下。
初始化和结束函数
1. MV_OpenDevice
原型: MV API HANDLE WINAPI MV_OpenDevice( DWORD Index, BOOL bRelese )
说明:初始化,创建Index指定的设备。
入口参数:
Index : 采集卡的序列下标,是从0开始的整数;
bRelese: 为TRUE时使用Relese版本SDK包,否则使用DEBUG版本SDK包。当用户在调试自己的应用程序时设为
FALSE,当用户希望Relese自己的应用程序时为设TRUE以提高
程序的响应速度。
返回值:
返回Index对应的采集卡设备句柄; 以后对采集卡的操作均通过该句柄实现。如果返回NULL,调用MV_GetLastError得到
错误原因。
2.MV_CloseDevice
原型:MV API VOID WINAPI MV_CloseDevice( HANDLE hDevice )
第 10 页
说明:不再使用以hDevice标识的设备时,关闭该设备。
入口参数:
hDevice: 为先前用MV_OpenDevice创建并打开的设备句柄;
返回值:无。
例: (使用多卡时) 假如HANDLE hDev为先前打开的设备句柄,现在关闭它并打开第二个设备, 使用调试版本;
if( hDev != NULL )
MV_CloseDevice( hDev );
hDev = NULL;
hDev = MV_OpenDevice( 1, FALSE );
if( hDev == NULL )
{
MV_GetLastError( TRUE );
return ERROR;
}
// OK!现在hDev放有第二个设备句柄
板卡操做函数
1.MV_GetDeviceNumber
原型:MV API DWORD WINAPI MV_GetDeviceNumber()
说明:得到主机中正确安装的采集卡数目。
入口参数:无。
返回值:主机中正确安装的采集卡数目。
第 11 页
2. MV_OperateDevice
原型:MV API RUNOPER WINAPI MV_OperateDevice ( HANDLE hDevice, RUNOPER Oper )
说明:操纵设备, 即使采集卡处于运行/停止/暂停状态。所谓运行即设备处于采集图像数据的状态,而停止和暂停未采集图像
数据。
入口参数:
hDevice: 设备句柄;
Oper: 设备的状态(运行,停止,暂停,查询);
返回值:返回卡的当前工作状态。当为MVERROR时代表操作失
败,调用MV_GetLastError得到错误原因。
例: 打开第三个设备使它处于运行状态:
HANDLE hDev = MV_OpenDevice( 2, FALSE );
if( hDev == NULL )
{
MV_GetLastError( TRUE );
return ERROR;
}
// 为了让它在一个窗口显示, hWndHandle为显示窗口的窗口句柄
MV_SetDeviceParameter(hDevice, DISP_WHND, (DWORD) hWndHandle);
If (MV_OperateDevice(hDevice, MVRUN) == MVERROR )
......
第 12 页
例:查询卡的工作状态:
RUNOPER WorkStatu = MV_OperateDevice ( hDevice,
MVQUERYSTATU );
switch( WorkStatu )
{
case MVSTOP : MessageBox( 0, "停止", "当前工作状态", 0 );
break;
case MVRUN : MessageBox( 0, "运行", "当前工作状态", 0 );
break;
case MVPAUSE : MessageBox( 0, "暂停", "当前工作状态", 0 );
break;
case MVERROR : MessageBox( 0, "错误", "当前工作状态", 0 );
break;
}
3. MV_SetDeviceParameter
原型:MV API BOOL WINAPI MV_SetDeviceParameter( HANDLE hDevice, MV_PARAMTER Oper, DWORD Val );
说明:设置设备和SDK的工作参数。
入口参数:
hDevice: 设备句柄;
Oper: 欲设置工作参数的类型;
Val: 欲设置参数的值。
返回值:返回TRUE代表参数设置成功;FALSE代表失败,一
般原因为该类型的卡不支持该类型的工作参数。
第 13 页
下面简单列举一下VGA/M系列卡编程使用的自定义常量MV_PARAMTER,详细说明在自定义枚举类型部分。
控制显示的:
DISP_PRESENCE,DISP_WHND,DISP_TOP, DISP_LEFT,
DISP_HEIGHT,DISP_WIDTH
控制A/D的调节参数的:
ADJUST_R_LUM, ADJUST_G_LUM, ADJUST_B_LUM,
ADJUST_R_COARSE,ADJUST_G_COARSE,
ADJUST_B_COARSE
控制板卡的捕获参数的:
GARB_XOFF, GARB_YOFF,
GARB_HEIGHT,GARB_WIDTH, GARB_BITDESCRIBE,
GARB_WHOLEWIDTH
控制板卡的工作参数的:
WORK_UPDOWN, WORK_FLIP, WORK_SKIP,
WORK_INTERLACE,WORK_ISBLACK, WORK_FIELD 控制其它的:
GET_BOARD_TYPE,
SET_GARBIMAGEINFO,SET_DISPIMAGEINFO
应注意的是每个参数都有适用的卡型和默认的值,如果你
没有设置,系统将会使用默认的值。
例: 希望采集800*600的VGA图像,采集格式8位,直接显示到指定窗体上,并设置显示的起始点坐标。
// 设置采集为800*600
第 14 页
MV_SetDeviceParameter( hDevice, GARB_WIDTH, 800 );
MV_SetDeviceParameter( hDevice, GARB_HEIGHT, 600 );
// 设置显示窗体和显示起点坐标为(20,20)
MV_SetDeviceParameter(hDevice, DISP_WHND, (DWORD)
hWndHandle);
MV_SetDeviceParameter( hDevice, DISP_LEFT,20 );
MV_SetDeviceParameter( hDevice, DISP_TOP, 20 );
4. MV_GetDeviceParameter
原型:MV API LONG WINAPI MV_GetDeviceParameter( HANDLE hDevice, MV_PARAMTER Oper )
说明:得到设备参数的当前值。
入口参数:hDevice: 设备句柄;
Oper: 欲设置工作参数的类型。
返回值: 返回-1代表失败,一般原因为该类型的卡不支持该类型的工作参数。否则代表Oper参数的当前值。
例: 在当前的绿路亮度的基础上对绿路亮度进行调节
// 得到当前的绿路亮度
ULONG G_Lum=MV_GetDeviceParameter(hDev,
ADJUST_G_LUM );
// 改变当前的绿路亮度
第 15 页
MV_SetDeviceParameter( hDevice, ADJUST_G_LUM, (G_Lum +
10) );
5. MV_SaveDeviceParam
原型:MV API BOOL WINAPI MV_SaveDeviceParam( HANDLE hDevice )
说明:将用户设置的所有工作参数的当前值保留当做以后的工作参数的默认值。
入口参数:hDevice: 设备句柄。
返回值: TRUE调用成功;FALSE调用失败。调用MV_GetLastError得到错误原因;
6. MV_ResetDeviceParam
原型: MV API BOOL WINAPI MV_ResetDeviceParam( HANDLE hDevice )
说明:将工作参数的默认值恢复到工作参数的当前值。
入口参数:参数 hDevice: 设备句柄。
返回值:返回: TRUE调用成功;FALSE调用失败。调用MV_GetLastError得到错误原因。
内存操做函数
内存的操作中的连续采集是一种异步的操作,用户调用启动采集函数后会立刻启动采集,并且立刻返回;当采集的条件满足时SDK回
第 16 页
给你通知以及用户想要的图像;而且用户也可以在采集时打断采集。 1. MV_AllocSequenceFrameMemory
原型:MV API BOOL WINAPI MV_AllocSequenceFrameMemory ( HANDLE hDevice, ULONG Action, DWORD Number,
CALLBACKTYPE MemoryType )
说明:对设备分配大帧存, 该帧存用于存放原始的数据还是存放处理过的数据需要用户在调用该函数时指定。因为原始数
据中图像每个像素所占的位数可能与处理过的数据不同,
而且图像的宽度也可能不同。
入口参数:hDevice : 设备句柄
Number : 欲分配帧存能存放的图像的数目。
Action : 保留待扩展。该参数指定帧存的类型,
当前只是一个扩展没有任何意义。为以后可
为用户定制大帧存操控的方式。
MemoryType: 指定该帧存用于存放原始数据还是处
理过的数据;即BEFORE_PROCESS或
AFTER_PROCESS。
返回值:返回TRUE:SUCCESS; FALSE UNSUCCESS;
该函数可多次使用,用户无需担心会有内存泄漏。但是应该注意的是当您分配了很大的帧存却长期不使用时,应调用MV_FreeSequenceFrameMemory来释放该内存,否则会对操作系统的内存管理造成很大的压力。
第 17 页
2. MV_FreeSequenceFrameMemory
原型:MVAPI BOOL WINAPI MV_FreeSequenceFrameMemory( HANDLE hDevice )
说明:释放设备先前分配的大帧存。一般来说分配和释放是一一对应的,但这里用户编程时可以多次调用分配帧存函数,
而在最后应用程序退出时调用释放函数。
入口参数 : hDevice : 设备句柄。
返回值: 返回TRUE:SUCCESS; FALSE UNSUCCESS。
3. M V_SequenceCaptureStart
原型:MVAPI BOOL WINAPI MV_SequenceCaptureStart( HANDLE hDevice, CONTINUEGARBMECHANISM pContinueCall, PVOID
pContext )
说明:开始进行连续捕获,捕获到的图像存放在用户分配的帧存之中。当连续帧捕获结束或用户调用
MV_SequenceCaptureStop函数发出停止捕获命令,用户设
置的回调将会被调用。
入口参数: hDevice : 设备句柄
pContinueCall:连续捕捉机制的用户回调,捕获
结束或调用MV_SequenceCaptureStop停
止时该回调被调用。原型为: VOID (WINAPI *CONTINUEGARBMECHANISM)( PVOID pData,
PMV_IMAGEINFO pImage, ULONG ImageNumber, ULONG
wholeLength,PVOID pUserData )
第 18 页
pData : 数据缓冲区。
pImage : 数据缓冲区内每个图像的描述。
ImageNumber: 连续捕捉了多少幅图。
wholeLength: 数据缓冲区的全长,以字节记。
pUserData : 用户传递给回调函数的任意数据。
返回值: 返回TRUE:SUCCESS; FALSE:UNSUCCESS。
4. MV_SequenceCaptureStop
原型: MVAPI LONG WINAPI MV_SequenceCaptureStop( HANDLE hDevice )
说明:停止对设备帧存的连续捕获,可在任何您希望打断连续采集的时刻发出。
入口参数:hDevice : 设备句柄。
返回值:返回TRUE:SUCCESS; FALSE:UNSUCCESS。5. MV_GetSequenceFrameAddress
原型:MVAPI PVOID WINAPI MV_GetSequenceFrameAddress( HANDLE hDevice, ULONG
FrameNo, PMV_IMAGEINFO pPropertiy )
说明:根据帧号FrameNo返回该帧的地址和帧属性。
入口参数: hDevice : 设备句柄。
FrameNo : 连续帧的帧号,以0为起始。
pPropertiy : 数据缓冲区内每个图像的描述。
返回值:返回帧号为FrameNo的帧地址。NULL代表错误,一般是
第 19 页
因为FrameNo大于分配的帧存。
例:下面的代码将希望连续采集多幅图像(例如100幅),且在采集进行时用户可以中断采集,这种采集是一种异步的采集。
VOID CMYCapture::StopCapture(....) // 采集进行时用户可
以中断采集
{
MV_SequenceCaptureStop( hDev );
}
VOID CMYCapture::StartCapture(....)
{
// 对设备分配100幅图像的帧存用于捕获处理前即原始数据 MV_AllocSequenceFrameMemory( hDev, 0,100,
BEFORE_PROCESS );
MV_SequenceCaptureStart( hDev, ContinueGarbCallback,
this ); // 启动连续捕获
}
VOID CMYCapture::ProcessCaptureData( PVOID pData,
PIMAGEINFO pImage, ULONG ImageNumber )
{
MV_SaveFile( "Test", JPEG, pData, pImage, ImageNumber,
FALSE, TRUE, 50 );
MessageBox( 0, "连续采集结束", "采集了ImageNumber幅"
0 );
}
第 20 页