时间:2015-09-12 09:34 文章来源:http://www.lunwenbuluo.com 作者:高明 点击次数:
【摘 要】 本文主要讲述了一种低成本的水下准高速摄像系统。在录像时,系统首先将视频数据缓存在主机上,然后再将数据复制到硬盘当中。这种摄像系统的帧率大于普通的水下电视,画面质量也非常高,同时成本又远小于通常意义上的水下高速摄像系统,可以作为常规的水下电视和水下高速测量之间的过度设备,也填补了水下高速摄像与常速摄像之间的空白。
【关键词】 水下摄像 准高速摄像 低成本
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()
{
…
for(i=0;i<g_Framecounter;i++)
{
memcpy(FrameInfo1.lBufPtr,bufptr[i],360960);if(MVC_PixelConverter2(m_iCurDevNo,pFrameInfo1,pFrameInfo2,1)==CY_RESULT_OK)
{
GetDlgItem(IDC_SAVEAVI)->SetWindowText("等待");
GetDlgItem(IDC_SAVEAVI)->EnableWindow(FALSE);
}
MV_AVIFileAddFrame(0,g_pBitmapInfo,(LPBYTE)FrameInfo2.lBufPtr,1);//
}
GetDlgItem(IDC_SAVEAVI)->SetWindowText("保存 AVI");
MV_AVIFileFini();
GetDlgItem(IDC_SAVEAVI)->EnableWindow(TRUE);
}
程序从内存中读取视频数据,是最为关键的时期,在此期间,程序不能响应其他动作,只能完成这一项工作。所以将IDC_SAVEAVI文本内容写为“等待”,并且禁用。当程序读取数据完毕时,才改为可用。
保存在内存中的视频数据实际上是黑白数据,但是,这种准高速摄像我们通常希望是能得到彩色图像,于是通过MVC_PixelConverter2()将黑白图像转化为彩色图像,并保存到AVI文件中。在高速或者是准高速摄像时,回放研究视频数据经常是逐帧回放、研究,所以在保存视频数据时,是不需要压缩的。
5 结语
这种低成本的水下准高速观测摄像系统实际上是填补了普通的水下常速摄像和较昂贵的高速摄像之间的空白,既增加了目标的可观测速度,又不至于使成本增加很多。
这种水下准高速摄像系统在实际当中已经有过使用,并且取得了良好的效果。
参考文献:
[1]孙鑫.VC++深入详解[M].电子工业出版社,2012.
联系方式
随机阅读
热门排行