摘 要: 物体在不同介质中的运动轨迹受到介质的粘度、比重的影响,将物体的运行轨迹从图片中提取出来,有助于分析物体在不同介质中的运动规律。本文中动态视频转换成静态bmp图片序列,采用差影法针对bmp图片进行处理,再将处理后的系列bmp图片进行整合,得到物体的运行轨迹,呈现出物体运行轨迹曲线。结果表明差影法对物体运动轨迹的模拟可靠有效。
0 引言
数字图像处理是指将图像信号转换成数字信号并利用计算机对其进行处理的过程[1]。图像是人类获取和交换信息的主要来源,因此,图像处理的应用具有重要作用。本文基于差影法获取物体运动轨迹。运动轨迹是最重要的物体运动信息之一,通过运动轨迹可以很好地分析物体的运动规律,还可以计算出其他的运动信息,如速度、加速度[2]。使用差影法获取物体运动轨迹,方法简单,思路清晰,追踪运动物体轨迹的过程清晰明了,并且具有很高的鲁棒性和处理速度。
1 差影法的原理
差影法在动态检测与识别技术、血管造影技术及印刷线路板掩模缺陷的诊断等技术中都有应用,利用差影法可以检测同一场景中两幅图像间的差异[3]。差影法本质就是对图像进行代数运算,即对两幅图片中对应坐标位置的运算。本文的操作使用了图像相减的做法,即对于同一场景的两幅图,图像的背景是大致相同的,当两幅图进行相减时,相同位置的背景因为灰度值相同,使得像素值变为0,而目标物体因为位置不同,所以相减后值不为0,处理后的图像就只有两个目标物体的位置有像素点,背景因而变为黑色。可以据此得出物体的轨迹。其中输入图像为A(X,Y)和B(X,Y),输出图像为C(X,Y),满足公式C(X,Y)=A(X,Y)±B(X,Y)[4]。使用差影法将两幅图像相减所得结果如图1、图2和图3所示。
2 bmp图片文件格式
bmp图片文件由文件头、位图信息头、颜色信息和图形数据四部分组成[5]。文件头主要包含文件的大小、文件类型、图像数据偏离文件头的长度等信息;位图信息头包含图像的尺寸信息、图像用几个比特数值来表示一个像素、图像是否压缩、图像所用的颜色数等信息。颜色信息包含图像所用到的颜色表,显示图像时需用到这个颜色表来进行调色。文件中的数据块表示图像的相应的像素值。bmp文件中位图数据是以连续行的形式存储的[6]。具体格式如图4所示。
其中,颜色表的大小由位图信息头中的位深度决定,当位深度是1、4、8时,分别有2、16、256个颜色表项,当位深度是24时,图像为真彩色,图像中每个像素的颜色用3个字节表示,分别对应R、G、B值,图像文件没有颜色表项。
位图各部分详细内容如下:
文件头:
typedef struct tagBITMAPFILEHEADER {
WORD bfType; //位图文件类型
DWORD bfSize; //位图文件的大小
WORD bfReserved1; //位图文件保留字1
WORD bfReserved2; //位图文件保留字2
DWORD bfOffBits; //位图数据部分相
//对于文件头的偏移量
} BITMAPFILEHEADER,
FAR *LPBITMAPFILEHEADER,
*PBITMAPFILEHEADER;
信息头:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; //该结构所占字节数
LONG biWidth; //位图宽度
LONG biHeight; //位图高度
WORD biPlanes; //目标设备平面数目
WORD biBitCount; //位深度
DWORD biCompression; //压缩类型
DWORD biSizeImage; //位图数据大小
LONG biXPelsPerMeter; //水平分辨率
LONG biYPelsPerMeter; //垂直分辨率
DWORD biClrUsed; //使用的颜色表项数
DWORD biClrImportant;
} BITMAPINFOHEADER,
FAR *LPBITMAPINFOHEADER,
*PBITMAPINFOHEADER;
颜色表(RGB值):
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
其中颜色表和位图信息头组成位图信息:
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO,
*PBITMAPINFO;
3 视频处理流程
使用差影法,让两幅图片中不同的地方突显出来,以实现追踪物体运动轨迹的目的[7],处理流程如图5所示。首先将视频转换为帧序列,然后加载一幅图片作为背景,再将目标图片加载到内存,进行差影法处理,处理后若该图片不是最后一帧则保存差影后的结果为新的背景,继续操作,直至最后一帧图片(注:使用AVI格式视频,帧序列中的图片格式是bmp)。
4 差影法处理视频
使用的开发工具是Visual Studio2010,开发语言为C++,使用类库MFC、Opencv2。
4.1 视频转换为帧序列
使用Opencv2来实现avi视频转换为bmp格式图片序列。
使用cvCaptureFromFile(CString)函数来捕获视频中的每一帧。主要代码如下:
CvCapture *cap= cvCaptureFromFile(vedioName);
if (cap==NULL)
{
MessageBox("失败,请确认视频格式是avi !!");
EndWaitCursor();
}
char fileName[300]; //文件名
char* format=".bmp"; //图片格式
char* fileBag="d:\\testPics\\";
IplImage* pImg=NULL;
int frame=0;
//捕获每一帧图片
while((pImg=cvQueryFrame(cap))!=NULL) {
frame++;
strcpy(lastName,"");
sprintf(lastName,"%s%d%s",fileBag,frame,format);
//保存捕获的帧
cvSaveImage(fileName,pImg,NULL);
}
4.2 图片的加载
要处理图片必须将其加载到内存,然后才能做相应的处理。本系统使用MFC中的CFile类,通过CFile的Read函数将图片读入[8]。主要代码如下:
CFile file;
//用一定模式打开文件
if(!file.Open(pathName,CFile::modeRead)) return FALSE;
DWORD fileLength;
fileLength = file.GetLength();
char *m_pBMPBuffer = new char[fileLength + 1];
if(!m_pBMPBuffer)
return FALSE;
if(file.Read(m_pBMPBuffer,fileLength)!=m_nFileLen)
//从文件中读入指定字节数的数据
return FALSE;
file.Close();
4.3 使用差影法处理图片
通过分析bmp文件的格式,可以分别获取到图片的文件头、信息头、颜色表、像素数据。由于对同一视频获取的帧序列而言,它们的文件头、信息头和颜色表都是一致的,故仅处理像素数据部分,处理后,再利用原来图片的文件头、信息头和颜色表等信息,拼凑出一个新的bmp图片文件。主要代码如下:
BITMAPINFOHEADER &bmiHeader_old=
*(LPBITMAPINFOHEADER)hDIB_Old ;
BITMAPINFO &bmInfo_old=
*(LPBITMAPINFO)hDIB_Old ;
unsigned char pixelValue1,pixelValue2;
LPSTR lpDst;
LPSTR lpYuan,lpBack;
LONG i,j;
for (i=0;i { for(j=0;j { lpYuan=(char*)hDIB_Old_Data + perLineBytes * i + j; lpBack=(char *)hDIB_Template_Data + perLineBytes * i + j; lpDst = (char *)m_newBMPDATA + perLineBytes * i + j; pixelValue1= (unsigned char)* lpYuan; pixelValue2= (unsigned char)* lpBack; *lpDst=(pixelValue1-pixelValue2)<0?abs(pixelValue- pixelValue2) : (pixelValue1- pixelValue2); } } CClientDC dc(this); CreateDIBitmap(dc.m_hDC,&bmiHeader_old,CBM_INIT,m_ newBMPDATA,&bmInfo_old,DIB_RGB_COLORS); //创建位图 5 结果分析 针对图6和图7中的两帧图像使用差影法处理,得到如图8所示结果。由图8可以看出,差影法对求物体运动轨迹是可行的,并且处理后的结果清晰,可以准确地辨别出目标物体。 通过差影法的循环使用,得到目标物体的运动轨迹如图9所示。由图9看出,轨迹清晰明了,目标物体的轮廓明显,而且处理后的结果并无模糊现象[9]。验证了差影法模拟运动轨迹的可行性和可靠性。 6 结论 基于差影法来获取物体运动轨迹是可行的,并取得了良好的实验结果,达到了预期目的。文中对获取物体运动轨迹进行了一些研究,仍有以下内容需要进一步研究: (1)文中使用的视频格式为AVI,图片的格式为bmp,可以基于本研究,推广到其他视频格式和图片格式的应用。 (2)可以结合实际问题来分析运动物体的轨迹,如交通运输、实时监控、行为分析等领域,使系统的可用性更强。 参考文献 [1] 李立芳. 浅谈数字图像处理技术及应用[J]. 中国科技信息, 2012(3):78-79. [2] 孙达,黄剑华,唐降龙. 大场景中物体运动轨迹的测量[J]. 计算机工程, 2009,35(9):17-18. [3] 周彩霞,匡纲要,宋海娜,等. 基于差影法粗分割与多模板匹配的人脸检测[J]. 计算机工程与设计, 2004,25(10):1648-1650. [4] 降雨志,张义顺,张华军,等. 投影法和差影法在焊缝跟踪图像识别中的应用[J]. 沈阳工业大学学报, 2005,27(5):558-561. [5] 宋叶未,叶建芳. BMP格式位图文件的分析及显示算法[J]. 现代电子技术, 2011,34(20):5-7. [6] 张明敏. 图形图像文件格式解码实用程序[J]. 中国图像图形学报, 1998,3(5):73-79. [7] 罗佳佳. 基于差影法与摄像机定标技术的车牌定位研究[D].武汉:武汉理工大学, 2008. [8] 宋坤,刘锐宁,李伟明. Visual C++开发技术大全[M]. 北京:人民邮电出版社, 2008. [9] 杨晓晓. 高速运动物体轨迹预测的研究[D]. 北京:北京交通大学,2012.