一种低成本水下准高速摄像系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【摘要】本文主要讲述了一种低成本的水下准高速摄像系统。在录像时,系统首先将视频数据缓存在主机上,然后再将数据复制到硬盘当中。这种摄像系统的帧率大于普通的水下电视,画面质量也非常高,同时成本又远小于通常意义上的水下高速摄像系统,可以作为常规的水下电视和水下高速测量之间的过度设备,也填补了水下高速摄像与常速摄像之间的空白。
【关键词】水下摄像 准高速摄像 低成本
1 背景
通常情况下,我们需要对水下的目标进行视觉上的观测,这种观测经常采用水下电视的方法。这种普通的水下电视的帧率通常是25~30帧。但是,有的时候水下目标的运动速度比较大,通过普通的水下电视观测并不能取得非常良好的观测效果;如果采用高速摄像的方式测量的话,观测成本又增加很多。所以,在待观测目标的运行速度大于普通水下电视可以良好观测的速度而又没有达到必须采用高速摄像的方式去观测的速度时,我们设计了一种低成本的准高速水下目标观测系统。
2 系统原理
我们知道,一般的高速摄像机在录像时是将视频数据保存在自身的内部缓存中。这种缓存是易失性存储介质,存储速率非常高,大小一般在几个G至十几个G之间不等,这样可以保证将几秒至几十秒的视频数据不丢失的保存下来。然后再通过上位机将数据从高速摄像机中读取出来,并保存在硬盘当中。我们所设计的准高速摄像系统也采用了这种类似的设计方法。由于机芯本身并不带有缓存介质,所以我们只能将视频数据保存在显控主机上。机芯传递给显控主机的视频数据的速率是每秒752×480×60Bit,这样的数据如果直接保存在硬盘中,会由于硬盘的读写速度慢而造成数据大量丢失。于是我们便先将数据保存在显控主机的内存中,等到用户点击停止保存键或者最长录像时间到,再将视频数据从内存中读取出来,并保存在硬盘中。采用这种方法就不会丢失视频数据。这样做实际上就是把显控主机的内存当成了准高速摄像机的内部缓存,显控主机的内存大小就决定了可以记录的时间的长短。因为高速或者准高速摄像的观测录像时间都不会太长,一般为几秒至几十秒而已,所以这种方法可以满足要求。在XP系统上我们录像的时间可以达到33秒,而在Win7系统上,至少可以增加一倍。系统工业原理图如图1所示。
3 硬件系统
本系统的硬件有三部分组成:水下准高速摄像机、显控主机和连接缆。如图2所示。
水下准高速摄像机采用国产的MVC360-60GE机芯,这种准高速摄像机的帧率是每秒60帧,分辨率是752×480。这种摄像机本身不带有镜头,在工作时我们为其配备4.5-10mm变焦镜头,在空气中进行手动调焦。这样做的好处是可以通过调节,来改变水下可观测的距离。由于这种机芯的帧率是每秒60帧,分辨率是752×480,所以在进行数据传输时必须通过超五类的以太网线和水面显控主机相连,供电方式是通过水面24V供电。水面显控主机配有千兆网口,用来接收摄像机传来的视频数据,并且实时显示摄像画面。为了可靠工作,这种显控主机采用工控机。我们目前完成的系统是单摄像机系统,如果要多个摄像机同步工作,只需要加装配备统一触发的触发设备即可完成同步观测和保存。
一般的水下高速摄像系统与本系统在硬件构成上主要差别在高速摄像机的机芯与高速摄像系统水面显控主机的监控软件上。本系统的机芯只是准高速机芯,较国外进口的高速摄像机机芯要便宜得多。另外,若使用国外进口的高速摄像机机芯就必须配套使用相关的软件,而本系统的软件完全由自己设计开发,可以自由设计功能与界面,从而进一步降低了产品的成本。
4 软件系统
系统每采集到一帧图像,就会调用一次回调函数MStreamProc()。于是在录像时,在MStreamProc()中添加将视频数据保存到内存的代码。在保存视频数据以前,需要先申请一段内存空间。为了能够最大程度上获得大的内存空间,从而获得更长的录像时间,本系统在保存时申请了两段内存并初始化了一个空的AVI文件:
void CMVCTestDlg::OnSaveavi()
{
...
if(MVC_SaveAVIName(m_iCurDevNo,(char*)(LPCTSTR)mFilename, &mCOMPVARS)== CY_RESULT_OK)
{
ptr = (LPBYTE)malloc(512000000);
ptr1 = (LPBYTE)malloc(256000000);
MV_AVIFileInit(541215044, m_FrameRate);
}
…
}
内存申请完以后,将要保存的视频数据一帧一帧的连续保存在申请到的内存中。
UINT WINAPI MStreamProc(WORD wHWCardNo,MVCFRAMEINFO m_FrameInfo, PVOID pUserData)
{
…
memcpy(ptr,(const void *)m_FrameInfo.lBufPtr,360960);//m_FrameInfo.lBufSize bufptr[g_Framecounter]=ptr;
if(g_Framecounter<1417)
{
ptr=(ptr+360960);//(void)
g_Framecounter=g_Framecounter+1;
}
else
{
if(g_Framecounter<1982)//2120 {
ptr=ptr1+(g_Framecounter-1417)*360960;
g_Framecounter=g_Framecounter+1;
}
else
{
g_AVISave=1;
}
}
…
}
当点击停止保存或者是保存的最大时间到了以后,系统会停止向内存中写入数据,同时从内存中将数据读取到硬盘,写入通过MV_AVIFileInit()初始化了的空AVI文件中。
void CMVCTestDlg::OnSaveavi()