驗證OpenCV中的Camshift跟蹤算法_第1頁
驗證OpenCV中的Camshift跟蹤算法_第2頁
驗證OpenCV中的Camshift跟蹤算法_第3頁
驗證OpenCV中的Camshift跟蹤算法_第4頁
驗證OpenCV中的Camshift跟蹤算法_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

2014-2015-(1)-圖像系統(tǒng)設(shè)計《圖像系統(tǒng)設(shè)計》實習(xí)報告成績:評閱人:學(xué)院專業(yè)年級班級姓名學(xué)號日期問題描述:驗證OpenCV中的Camshift跟蹤算法,并給出至少一個輸入上的改進(jìn),比如輸入的不是顏色直方圖,而是梯度直方圖,比較結(jié)果;說明:視頻跟蹤或者目標(biāo)識別中,需要獲取目標(biāo)的位置,然后再進(jìn)行后續(xù)的分析。請參考OpenCV中的Camshift算法完成目標(biāo)跟蹤,并將輸入的顏色信息改為其它特征來比較一下跟蹤結(jié)果。問題分析:闡述你對問題的理解camshift利用目標(biāo)的顏色直方圖模型將圖像轉(zhuǎn)換為顏色概率分布圖,初始化一個搜索窗的大小和位置,并根據(jù)上一幀得到的結(jié)果自適應(yīng)調(diào)整搜索窗口的位置和大小,從而定位出當(dāng)前圖像中目標(biāo)的中心位置。對算法的改進(jìn)是將輸入的顏色直方圖變成梯度直方圖,觀察實現(xiàn)的結(jié)果跟原來有什么區(qū)別,是否能夠從上一幀的結(jié)果定位出當(dāng)前圖像中目標(biāo)的中心位置。這個問題的解決方案是通過OpenCV結(jié)合vs2010實現(xiàn)的,OpenCV的頭文件不僅包含了Camshift算法的函數(shù),還有創(chuàng)建直方圖、計算反向投影等函數(shù),為問題的解決提供了便利。解決問題的方案說明解決問題方案:利用OpenCV,通過調(diào)用函數(shù)打開筆記本電腦的攝像頭作為視頻流的輸入,用鼠標(biāo)截取圖片并通過函數(shù)轉(zhuǎn)換為HSV圖,又將HSV圖轉(zhuǎn)換成直方圖,最后轉(zhuǎn)換成色彩概率分布圖,計算搜索區(qū)域的質(zhì)心位置,根據(jù)窗口中像素值總和調(diào)整窗口尺寸,移動窗口中心到質(zhì)心的位置,并判斷是否收斂。如果沒有收斂,則返回到計算搜索區(qū)域質(zhì)心的位置;如果收斂,則計算新的搜索區(qū)域的中心,和窗口尺寸,一方面確定處理區(qū)域,一方面返回到計算搜索區(qū)域質(zhì)心的位置。實驗環(huán)境配置因為需要OpenCV和vs2010的結(jié)合使用,我們必須對其進(jìn)行環(huán)境的配置,以利于開發(fā)。我是在windows7x64的平臺上安裝vs2010和配置OpenCV(版本2.4.9)的。配置過程如下:下載OpenCV2.4.9并解壓到D:\ProgramFiles。配置環(huán)境變量:計算機(jī)->(右鍵)屬性->高級系統(tǒng)設(shè)置->高級(標(biāo)簽)->環(huán)境變量〉(雙擊)path(用戶,系統(tǒng)里面的path任選其一)->在變量值里面添加相應(yīng)的路徑:D:\ProgramFiles\opencv\build\x64\vc10\bin;D:\ProgramFiles\opencv\build\x86\vc10\bin工程包含(include)目錄的配置:打開vs2010,新建一個空的Win32控制臺項目,一次選擇“視圖,其他窗口,屬性管理器,在新出現(xiàn)的“屬性管理器”工作區(qū)中。點擊項目->Debug|Win32->Microsoft.Cpp.Win32.userDirectories(反鍵屬性,或者雙擊)即可打開屬性頁面?!就ㄓ脤傩浴?>【VC++目錄】->【包含目錄中】,添加上:D:\ProgramFiles\opencv\build\includeD:\ProgramFiles\opencv\build\include\opencvD:\ProgramFiles\opencv\build\include\opencv2這三個目錄。工程庫(lib)目錄的而配置:【通用屬性】->【VC++目錄】->【包含目錄中】,添加上:D:\ProgramFiles\opencv\build\x86\vc10\lib鏈接庫的配置:【通用屬性】->【VC++目錄】->【包含目錄中】,添加上:opencv_ml249d.libopencv_calib3d249d.libopencv_contrib249d.libopencv_core249d.libopencv_features2d249d.libopencv_flann249d.libopencv_gpu249d.libopencv_highgui249d.libopencv_imgproc249d.libopencv_legacy249d.libopencv_objdetect249d.libopencv_ts249d.libopencv_video249d.libopencv_nonfree249d.libopencv_ocl249d.libopencv_photo249d.libopencv_stitching249d.libopencv_superres249d.libopencv_videostab249d.libopencv_objdetect249.libopencv_ts249.libopencv_video249.libopencv_nonfree249.libopencv_ocl249.libopencv_photo249.libopencv_stitching249.libopencv_superres249.libopencv_videostab249.libopencv_calib3d249.libopencv_contrib249.libopencv_core249.libopencv_features2d249.libopencv_flann249.libopencv_gpu249.libopencv_highgui249.libopencv_imgproc249.libopencv_legacy249.libopencv_ml249.lib6.在Windows文件夾下加入OpenCV動態(tài)鏈接庫將D:\ProgramFiles\opencv\build\x86\vc10\bin目錄下的所有dll文件復(fù)制到C:\Windows下面。數(shù)據(jù)模型:相關(guān)數(shù)據(jù)結(jié)構(gòu)、對象模型、全局變量,重要形式參數(shù)、局部變量等等,它們的命名及用途解釋1、cvInRangeS函數(shù)的使用cvInRangeS函數(shù)可用于檢查一個矩陣中的像素灰度值是否屬于某一指定范圍。并且可以輸出一個單通道矩陣來進(jìn)行標(biāo)識。voidcvInRangeS(constCvArr*src,CvScalarlower,CvScalarupper,CvArr*dst);src第一個原數(shù)組lower包括進(jìn)的下邊界.upper不包括進(jìn)的上邊界dst輸出數(shù)組必須是8u或8s類型.對于單通道數(shù)組:dst(i)=(lower[0]<=src(i)[0]<upper[0])//值只能是0或1,處于設(shè)置的值的中間就為1,不在中間就為0對于雙通道數(shù)組以此類推:dst(i)=((lower[0]<=src(i)[0]<upper[0])&&(lower[0]<=src(i)[0]<upper[0]));如果src(i)在lower和upper的范圍內(nèi),則dst(i)被設(shè)置為0xff(每一位都是'1')否則置0。2、cvCreateHist函數(shù)的使用函數(shù)功能:創(chuàng)建直方圖CvHistogram*cvCreateHist(intdims,int*sizes,inttype,float**ranges=NULL,intuniform=1);dims直方圖維數(shù)的數(shù)目sizes直方圖維數(shù)尺寸的數(shù)組type直方圖的表示格式:CV_HIST_ARRAY意味著直方圖數(shù)據(jù)表示為多維密集數(shù)組CvMatND;CV_HIST_TREE意味著直方圖數(shù)據(jù)表示為多維稀疏數(shù)組CvSparseMat.ranges圖中方塊范圍的數(shù)組.它的內(nèi)容取決于參數(shù)uniform的值。這個范圍的用處是確定何時計算直方圖或決定反向映射(backprojected),每個方塊對應(yīng)于輸入圖像的哪個/哪組值。(對于單維直方圖,該參數(shù)可以這樣申明:floatranges_arr[]={0,255};//這里按照需要計算的范圍而定float*ranges=hranges_arr;)uniform歸一化標(biāo)識。如果不為0,則ranges[i](i的取值為:0<=i數(shù)組,包括直方圖第i維的上界和下界。在第i維上的整個區(qū)域[lower,upper]被分割成dims[i]個相等的塊(dims[i]表示直方圖第i維的塊數(shù)),這些塊用來確定輸入象素的第i個值(對于彩色圖像,i確定R,G,或者B)的對應(yīng)的塊;如果為0,則ranges[i]是包含dims[i]+1個元素的范圍數(shù)組,包括lower0,upper0,lower1,upper1==lower2,...,upperdims[i]-1,其中l(wèi)owerj和upperj分別是直方圖第i維上第j個方塊的上下界(針對輸入象素的第i個值)。任何情況下,輸入值如果超出了一個直方塊所指定的范圍外,都不會被cvCalcHist計數(shù),而且會被函數(shù)cvCalcBackProject置零。3、 cvCalcHist函數(shù)的使用函數(shù)功能:用來計算一張或多張單通道圖像的直方圖voidcvCalcHist(IplImage**image,CvHistogram*hist,intaccumulate=0,constCvArr*mask=NULL);image輸入圖像(雖然也可以使用CvMat**).hist直方圖指針,使用前可以先創(chuàng)建一個空的直方圖accumulate累計標(biāo)識。如果設(shè)置,則直方圖在開始時不被清零。這個特征保證可以為多個圖像計算一個單獨的直方圖,或者在線更新直方圖。mask操作mask,確定輸入圖像的哪個象素被計數(shù)(mask相應(yīng)位置為0的不計數(shù))4、 cvConvertScale函數(shù)的使用voidcvConvertScale(constCvArr*src,CvArr*dst,doublescale=1,doubleshift=0);src輸入數(shù)組.dst輸出數(shù)組scale比例因子.shift該加數(shù)被加到輸入數(shù)組元素按比例縮放后得到的元素上該函數(shù)首先對輸入數(shù)組的元素進(jìn)行比例縮放,然后將shift加到比例縮放后得到的各元素上,即:dst(i)=src(i)*scale+shift,最后將結(jié)果拷貝到輸出數(shù)組。5、 cvCalcBackProject函數(shù)的使用函數(shù):計算反向投影voidcvCalcBackProjec(IplImage**image,CvArr*back_project,constCvHistogram*hist);image輸入圖像(也可以傳遞CvMat**).back_project反向投影圖像(輸出),與輸入圖像具有同樣類型.hist直方圖函數(shù)原理cvCalcBackProject計算直方圖的反向投影.對于所有輸入的單通道圖像同一位置的象素數(shù)組,該函數(shù)根據(jù)相應(yīng)的象素數(shù)組(RGB),放置其對應(yīng)的直方塊的值到輸出圖像中。用統(tǒng)計學(xué)術(shù)語,輸出圖像象素點的值是觀測數(shù)組在某個分布(直方圖)下的概率。6、 cvAnd、cvXors和cvOr函數(shù)邏輯運算的函數(shù),具體可以參照:/guzhou_diaoke/item/1e93e48ad073be5ce63d19f57、 cvCamShift函數(shù)CamShift算法描述整個算法的具體步驟分5步:Step1:將整個圖像設(shè)為搜尋區(qū)域。Step2:初始話SearchWindow的大小和位置。Step3:計算SearchWindow內(nèi)的彩色概率分布,此區(qū)域的大小比SearchWindow要稍微大一點。Step4:運行MeanShift。獲得SearchWindow新的位置和大小。Step5:在下一幀視頻圖像中,用Step3獲得的值初始化SearchWindow的位置和大小。跳轉(zhuǎn)到Step3繼續(xù)運行。OpenCV實現(xiàn)CamShift算法的函數(shù),函數(shù)的原型是:cvCamShift(IplImage*imgprob,CvRectwindowIn,CvTermCriteriacriteria,CvConnectedComp*out,CvBox2D*box=0);其中:imgprob:色彩概率分布圖像。windowIn:SearchWindow的初始值。Criteria:用來判斷搜尋是否停止的一個標(biāo)準(zhǔn)。out:保存運算結(jié)果,包括新的SearchWindow的位置和面積。box:包含被跟蹤物體的最小矩形算法描述:解題算法的設(shè)計思路介紹;CamShift算法的全稱是"ContinuouslyApaptiveMean-SHIFT",它的基本思想是視頻圖像的所有幀作MeanShift運算,并將上一幀的結(jié)果(即SearchWindow的中心和大小)作為下一幀MeanShift算法的SearchWindow的初始值,如此迭代下去,就可以實現(xiàn)對目標(biāo)的跟蹤。整個算法的具體步驟分5IR步:Step1:將整個圖像設(shè)為搜尋區(qū)域。Step2:初始話SearchWindow的大小和位置。Step3:計算SearchWindow內(nèi)的彩色概率分布,此區(qū)域的大小比SearchWindow要稍微大一點。Step4:運行MeanShift。獲得SearchWindow新的位置和大小。Step5:在下一幀視頻圖像中,用Step3獲得的值初始化SearchWindow的位置和大小。跳轉(zhuǎn)到Step3繼續(xù)運行。CamShift算法流程如圖1所示=圖ICamShjQ算液流程主要程序代碼,加上詳細(xì)的注釋#ifdef_CH_#pragmapackage<opencv>#endif#ifndef_EiC#include"cv.h"#include"highgui.h"#include<stdio.h>#include<ctype.h>#endifIplImage*image=0,*hsv=0,*hue=0,*mask=0,*backproject=0,*histimg=0;//用HSV中的Hue分量進(jìn)行跟蹤C(jī)vHistogram*hist=0;//直方圖類intbackproject_mode=0;intselect_object=0;inttrack_object=0;intshow_hist=1;CvPointorigin;CvRectselection;CvRecttrack_window;CvBox2Dtrack_box;//Meanshift跟蹤算法返回的Box類//typedefstructCvBox2D(//CvPoint2D32fcenter;//CvSize2D32fsize;//floatangle;//}CvBox2D;CvConnectedComptrack_comp;〃連接部件//typedefstructCvConnectedComp(//doublearea;//floatvalue;//CvRectrect;//}CvConnectedComp;inthdims=16;〃劃分直方圖bins的個數(shù),越多越精確floathranges_arr[]=(0,180};//像素值的范圍float*hranges=hranges_arr;//用于初始化CvHistogram類intvmin=10,vmax=256,smin=30;//用于設(shè)置滑動條voidon_mouse(intevent,intx,inty,intflags,void*param)〃鼠標(biāo)回調(diào)函數(shù),該函數(shù)用鼠標(biāo)進(jìn)行跟蹤目標(biāo)的選擇(if(!image)return;if(image->origin)y=image->height-y;〃如果圖像原點坐標(biāo)在左下,則將其改為左上if(select_object)//select_object為1,表示在用鼠標(biāo)進(jìn)行目標(biāo)選擇//此時對矩形類selection用當(dāng)前的鼠標(biāo)位置進(jìn)行設(shè)置(selection.x=MIN(x,origin.x);selection.y=MIN(y,origin.y);selection.width=selection.x+CV_IABS(x-origin.x);selection.height=selection.y+CV_IABS(y-origin.y);selection.x=MAX(selection.x,0);selection.y=MAX(selection.y,0);selection.width=MIN(selection.width,image->width);selection.height=MIN(selection.height,image->height);selection.width-=selection.x;selection.height-=selection.y;switch(event){caseCV_EVENT_LBUTTONDOWN:〃鼠標(biāo)按下,開始點擊選擇跟蹤物體origin=cvPoint(x,y);selection=cvRect(x,y,0,0);select_object=1;break;caseCV_EVENT_LBUTTONUP:〃鼠標(biāo)松開,完成選擇跟蹤物體select_object=0;if(selection.width>0&&selection.height>0)〃如果選擇物體有效,則打開跟蹤功能track_object=-1;break;}}CvScalarhsv2rgb(floathue)//用于將Hue量轉(zhuǎn)換成RGB量{intrgb[3],p,sector;staticconstintsector_data[][3]={{0,2,1},{1,2,0},{1,0,2},{2,0,1},{2,1,0},{0,1,2}};hue*=0.033333333333333333333333333333333f;sector=cvFloor(hue);p=cvRound(255*(hue-sector));pA=sector&1?255:0;rgb[sector_data[sector][0]]=255;rgb[sector_data[sector][1]]=0;rgb[sector_data[sector][2]]=p;returncvScalar(rgb[2],rgb[1],rgb[0],0);}intmain(intargc,char**argv){CvCapture*capture=0;if(argc==1II(argc==2&&strlen(argv[1])==1&&isdigit(argv[1][0])))〃打開攝像頭capture=cvCaptureFromCAM(argc==2?argv[1][0]-'0':0);elseif(argc==2) 〃打開avicapture=cvCaptureFromAVI(argv[1]);if(!capture)〃打開視頻流失敗{fprintf(stderr,"Couldnotinitializecapturing...\n");return-1;}printf("Hotkeys:\n""\tESC-quittheprogram\n""\tc-stopthetracking\n""\tb-switchto/frombackprojectionview\n""\th-show/hideobjecthistogram\n""Toinitializetracking,selecttheobjectwithmouse\n");〃打印程序功能列表cvNamedWindow("Histogram",1);//用于顯示直方圖cvNamedWindow("CamShiftDemo",1);//用于顯示視頻cvSetMouseCallback("CamShiftDemo",on_mouse,0);〃設(shè)置鼠標(biāo)回調(diào)函數(shù)cvCreateTrackbar("Vmin","CamShiftDemo",&vmin,256,0);cvCreateTrackbar("Vmax","CamShiftDemo",&vmax,256,0);cvCreateTrackbar("Smin","CamShiftDemo",&smin,256,0);〃設(shè)置滑動條for(;;)〃進(jìn)入視頻幀處理主循環(huán){IplImage*frame=0;inti,bin_w,c;frame=cvQueryFrame(capture);if(!frame)break;if(!image)//image為0,表明剛開始還未對image操作過,先建立一些緩沖區(qū){image=cvCreateImage(cvGetSize(frame),8,3);image->origin=frame->origin;hsv=cvCreateImage(cvGetSize(frame),8,3);hue=cvCreateImage(cvGetSize(frame),8,1);mask=cvCreateImage(cvGetSize(frame),8,1);//分配掩膜圖像空間backproject=cvCreateImage(cvGetSize(frame),8,1);//分配反向投影圖空間,大小一樣,單通道hist=cvCreateHist(1,&hdims,CV_HIST_ARRAY&hranges,1);//分配直方圖空間histimg=cvCreateImage(cvSize(320,200),8,3);//分配用于直方圖顯示的空間cvZero(histimg);〃置背景為黑色}cvCopy(frame,image,0);cvCvtColor(image,hsv,CV_BGR2HSV);//把圖像從RGB表色系轉(zhuǎn)為HSV表色系if(track_object)//track_object非零,表示有需要跟蹤的物體{int_vmin=vmin,_vmax=vmax;cvInRangeS(hsv,cvScalar(0,smin,MIN(_vmin,_vmax),0),cvScalar(180,256,MAX(_vmin,_vmax),0),mask);//制作掩膜板,只處理像素值為H:0?180,S:smin?256,V:vmin~vmax之間的部分cvSplit(hsv,hue,0,0,0);//分離H分量if(track_object<0)〃如果需要跟蹤的物體還沒有進(jìn)行屬性提取,則進(jìn)行選取框類的圖像屬性提取{floatmax_val=0.f;cvSetImageROI(hue,selection);〃設(shè)置原選擇框為ROIcvSetImageROI(mask,selection);〃設(shè)置掩膜板選擇框為ROIcvCalcHist(&hue,hist,0,mask);//得到選擇框內(nèi)且滿足掩膜板內(nèi)的直方圖cvGetMinMaxHistValue(hist,0,&max_val,0,0);cvConvertScale(hist->bins,hist->bins,max_val?255./max_val:0.,0);//對直方圖的數(shù)值轉(zhuǎn)為0~255cvResetImageROI(hue);〃去除ROIcvResetImageROI(mask);〃去除ROItrack_window=selection;track_object=1;〃置track_object為1,表明屬性提取完成cvZero(histimg);bin_w=histimg->width/hdims;for(i=0;i<hdims;i++)〃畫直方圖到圖像空間{int val =cvRound(cvGetReal1D(hist->bins,i)*histimg->height/255);CvScalarcolor=hsv2rgb(i*180.f/hdims);cvRectangle(histimg,cvPoint(i*bin_w,histimg->height),cvPoint((i+1)*bin_w,histimg->height-val),color,-1,8,0);cvCalcBackProject(&hue,backproject,hist);〃計算hue的反向投影圖cvAnd(backproject,mask,backproject,0);//得到掩膜內(nèi)的反向投影cvCamShift(backproject,track_window,cvTermCriteria( CV_TERMCRIT_EPS |CV_TERMCRIT_ITER,10,1),&track_comp,&track_box);//使用MeanShift算法對backproject中的內(nèi)容進(jìn)行搜索,返回跟蹤結(jié)果track_window=track_comp.rect;//得到跟蹤結(jié)果的矩形框if(backproject_mode)cvCvtColor(backproject,image,CV_GRAY2BGR);if(image->origin)track_box.angle=-track_box.angle;cvEllipseBox(image,track_box,CV_RGB(255,0,0),3,CV_AA,0);〃畫出跟蹤結(jié)果的位置}if(select_object&&selection.width>0&&selection.height>0)〃如果正處于物體選擇,畫出選擇框{cvSetImageROI(image,selection);cvXor

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論