摘 要: 物體在不同介質(zhì)中的運動軌跡受到介質(zhì)的粘度,、比重的影響,,將物體的運行軌跡從圖片中提取出來,有助于分析物體在不同介質(zhì)中的運動規(guī)律,。本文中動態(tài)視頻轉(zhuǎn)換成靜態(tài)bmp圖片序列,,采用差影法針對bmp圖片進行處理,再將處理后的系列bmp圖片進行整合,,得到物體的運行軌跡,,呈現(xiàn)出物體運行軌跡曲線。結(jié)果表明差影法對物體運動軌跡的模擬可靠有效,。
關(guān)鍵詞: 數(shù)字圖像處理,;運動軌跡差影法;bmp圖片
0 引言
數(shù)字圖像處理是指將圖像信號轉(zhuǎn)換成數(shù)字信號并利用計算機對其進行處理的過程[1],。圖像是人類獲取和交換信息的主要來源,,因此,圖像處理的應(yīng)用具有重要作用,。本文基于差影法獲取物體運動軌跡,。運動軌跡是最重要的物體運動信息之一,通過運動軌跡可以很好地分析物體的運動規(guī)律,,還可以計算出其他的運動信息,,如速度、加速度[2],。使用差影法獲取物體運動軌跡,,方法簡單,思路清晰,,追蹤運動物體軌跡的過程清晰明了,,并且具有很高的魯棒性和處理速度。
1 差影法的原理
差影法在動態(tài)檢測與識別技術(shù),、血管造影技術(shù)及印刷線路板掩模缺陷的診斷等技術(shù)中都有應(yīng)用,利用差影法可以檢測同一場景中兩幅圖像間的差異[3],。差影法本質(zhì)就是對圖像進行代數(shù)運算,即對兩幅圖片中對應(yīng)坐標位置的運算,。本文的操作使用了圖像相減的做法,,即對于同一場景的兩幅圖,圖像的背景是大致相同的,,當兩幅圖進行相減時,,相同位置的背景因為灰度值相同,使得像素值變?yōu)?,,而目標物體因為位置不同,,所以相減后值不為0,處理后的圖像就只有兩個目標物體的位置有像素點,,背景因而變?yōu)楹谏?。可以?jù)此得出物體的軌跡,。其中輸入圖像為A(X,Y)和B(X,Y),輸出圖像為C(X,Y),滿足公式C(X,Y)=A(X,Y)±B(X,Y)[4],。使用差影法將兩幅圖像相減所得結(jié)果如圖1、圖2和圖3所示,。
2 bmp圖片文件格式
bmp圖片文件由文件頭,、位圖信息頭、顏色信息和圖形數(shù)據(jù)四部分組成[5],。文件頭主要包含文件的大小,、文件類型、圖像數(shù)據(jù)偏離文件頭的長度等信息,;位圖信息頭包含圖像的尺寸信息,、圖像用幾個比特數(shù)值來表示一個像素,、圖像是否壓縮、圖像所用的顏色數(shù)等信息,。顏色信息包含圖像所用到的顏色表,,顯示圖像時需用到這個顏色表來進行調(diào)色。文件中的數(shù)據(jù)塊表示圖像的相應(yīng)的像素值,。bmp文件中位圖數(shù)據(jù)是以連續(xù)行的形式存儲的[6],。具體格式如圖4所示。
其中,,顏色表的大小由位圖信息頭中的位深度決定,,當位深度是1、4,、8時,,分別有2、16,、256個顏色表項,,當位深度是24時,圖像為真彩色,,圖像中每個像素的顏色用3個字節(jié)表示,,分別對應(yīng)R、G,、B值,,圖像文件沒有顏色表項。
位圖各部分詳細內(nèi)容如下:
文件頭:
typedef struct tagBITMAPFILEHEADER {
WORD bfType; //位圖文件類型
DWORD bfSize; //位圖文件的大小
WORD bfReserved1; //位圖文件保留字1
WORD bfReserved2; //位圖文件保留字2
DWORD bfOffBits; //位圖數(shù)據(jù)部分相
//對于文件頭的偏移量
} BITMAPFILEHEADER,
FAR *LPBITMAPFILEHEADER,
*PBITMAPFILEHEADER;
信息頭:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; //該結(jié)構(gòu)所占字節(jié)數(shù)
LONG biWidth; //位圖寬度
LONG biHeight; //位圖高度
WORD biPlanes; //目標設(shè)備平面數(shù)目
WORD biBitCount; //位深度
DWORD biCompression; //壓縮類型
DWORD biSizeImage; //位圖數(shù)據(jù)大小
LONG biXPelsPerMeter; //水平分辨率
LONG biYPelsPerMeter; //垂直分辨率
DWORD biClrUsed; //使用的顏色表項數(shù)
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 視頻處理流程
使用差影法,,讓兩幅圖片中不同的地方突顯出來,,以實現(xiàn)追蹤物體運動軌跡的目的[7],處理流程如圖5所示,。首先將視頻轉(zhuǎn)換為幀序列,,然后加載一幅圖片作為背景,再將目標圖片加載到內(nèi)存,,進行差影法處理,,處理后若該圖片不是最后一幀則保存差影后的結(jié)果為新的背景,繼續(xù)操作,,直至最后一幀圖片(注:使用AVI格式視頻,,幀序列中的圖片格式是bmp)。
4 差影法處理視頻
使用的開發(fā)工具是Visual Studio2010,,開發(fā)語言為C++,,使用類庫MFC、Opencv2。
4.1 視頻轉(zhuǎn)換為幀序列
使用Opencv2來實現(xiàn)avi視頻轉(zhuǎn)換為bmp格式圖片序列,。
使用cvCaptureFromFile(CString)函數(shù)來捕獲視頻中的每一幀,。主要代碼如下:
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 圖片的加載
要處理圖片必須將其加載到內(nèi)存,,然后才能做相應(yīng)的處理,。本系統(tǒng)使用MFC中的CFile類,通過CFile的Read函數(shù)將圖片讀入[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)
//從文件中讀入指定字節(jié)數(shù)的數(shù)據(jù)
return FALSE;
file.Close();
4.3 使用差影法處理圖片
通過分析bmp文件的格式,可以分別獲取到圖片的文件頭,、信息頭,、顏色表、像素數(shù)據(jù),。由于對同一視頻獲取的幀序列而言,,它們的文件頭、信息頭和顏色表都是一致的,,故僅處理像素數(shù)據(jù)部分,,處理后,再利用原來圖片的文件頭,、信息頭和顏色表等信息,,拼湊出一個新的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<bmHeight;i++) //對比每一個像素
{
for(j=0;j <perLineBytes;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);
//創(chuàng)建位圖
5 結(jié)果分析
針對圖6和圖7中的兩幀圖像使用差影法處理,,得到如圖8所示結(jié)果,。由圖8可以看出,差影法對求物體運動軌跡是可行的,,并且處理后的結(jié)果清晰,,可以準確地辨別出目標物體。
通過差影法的循環(huán)使用,,得到目標物體的運動軌跡如圖9所示,。由圖9看出,軌跡清晰明了,,目標物體的輪廓明顯,,而且處理后的結(jié)果并無模糊現(xiàn)象[9]。驗證了差影法模擬運動軌跡的可行性和可靠性,。
6 結(jié)論
基于差影法來獲取物體運動軌跡是可行的,,并取得了良好的實驗結(jié)果,達到了預期目的,。文中對獲取物體運動軌跡進行了一些研究,,仍有以下內(nèi)容需要進一步研究:
(1)文中使用的視頻格式為AVI,圖片的格式為bmp,可以基于本研究,,推廣到其他視頻格式和圖片格式的應(yīng)用,。
(2)可以結(jié)合實際問題來分析運動物體的軌跡,如交通運輸,、實時監(jiān)控,、行為分析等領(lǐng)域,使系統(tǒng)的可用性更強,。
參考文獻
[1] 李立芳. 淺談數(shù)字圖像處理技術(shù)及應(yīng)用[J]. 中國科技信息, 2012(3):78-79.
[2] 孫達,黃劍華,唐降龍. 大場景中物體運動軌跡的測量[J]. 計算機工程, 2009,35(9):17-18.
[3] 周彩霞,匡綱要,宋海娜,等. 基于差影法粗分割與多模板匹配的人臉檢測[J]. 計算機工程與設(shè)計, 2004,25(10):1648-1650.
[4] 降雨志,張義順,張華軍,等. 投影法和差影法在焊縫跟蹤圖像識別中的應(yīng)用[J]. 沈陽工業(yè)大學學報, 2005,27(5):558-561.
[5] 宋葉未,葉建芳. BMP格式位圖文件的分析及顯示算法[J]. 現(xiàn)代電子技術(shù), 2011,34(20):5-7.
[6] 張明敏. 圖形圖像文件格式解碼實用程序[J]. 中國圖像圖形學報, 1998,3(5):73-79.
[7] 羅佳佳. 基于差影法與攝像機定標技術(shù)的車牌定位研究[D].武漢:武漢理工大學, 2008.
[8] 宋坤,劉銳寧,李偉明. Visual C++開發(fā)技術(shù)大全[M]. 北京:人民郵電出版社, 2008.
[9] 楊曉曉. 高速運動物體軌跡預測的研究[D]. 北京:北京交通大學,2012.