meanshift 可以识别物体.docx
- 文档编号:30320611
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:16
- 大小:18.92KB
meanshift 可以识别物体.docx
《meanshift 可以识别物体.docx》由会员分享,可在线阅读,更多相关《meanshift 可以识别物体.docx(16页珍藏版)》请在冰豆网上搜索。
meanshift可以识别物体
以上为meanshift的数学原理。
有关文字的叙述已经在上一篇中提到了。
用meanshift来跟踪属于确定性算法,粒子滤波器属于统计学方法。
meanshift跟踪算法相对于粒子滤波器来说可能实时性更好一些,但是跟踪的准确性在理论上还是略逊于粒子滤波器的。
meanshift跟踪的的实质就是通过对应的模板来确定目标的下一个位置。
通过迭代找到新的中心点(即是目标的新的位置点)。
有关跟踪的code如下所示:
/**********************************************************************
BilkentUniversity:
Mean-shiftTrackerbasedMovingObjectTrackerinVideo
Version:
1.0
Compiler:
MicrosoftVisualC++6.0(testedinbothdebugandrelease
mode)
ModifiedbyMrZhou
**********************************************************************/
#include"ObjectTracker.h"
#include"utils.h"
#include
#include
#include
/*
#defineGetRValue(rgb) ((UBYTE8)(rgb))
#defineGetGValue(rgb) ((UBYTE8)(((ULONG_32)(rgb))>>8))
#defineGetBValue(rgb) ((UBYTE8)((rgb)>>16))
*/
//#defineRGB(r,g,b)((ULONG_32)(((UBYTE8)(r)|((UBYTE8)(g)<<8))|(((ULONG_32)(UBYTE8)(b))<<16)))
#definemin(a,b)(((a)<(b))?
(a):
(b))
#definemax(a,b)(((a)>(b))?
(a):
(b))
#defineMEANSHIFT_ITARATION_NO5
#defineDISTANCE_ITARATION_NO1
#defineALPHA1
#defineEDGE_DETECT_TRESHOLD32
//////////////////////////////////////////////////
/*
1给定目标的初始位置和尺寸,计算目标在图像中的直方图;
2输入新图像,迭代直到收敛:
计算图像上对应区域的新直方图;
新直方图与目标直方图比较,计算权重;
根据权重,计算图像上对应区域的形心/质心;
根据形心,修正目标位置;
直方图分为两部分,每部分大小4096,
RGB的256*256*256种组合,缩减为16*16*16=4096种组合.
如果目标区域的点是边缘点,则计入直方图的后一部分,
否则计入直方图的前一部分.
*/
//////////////////////////////////////////////////
CObjectTracker:
:
CObjectTracker(INT32imW,INT32imH,IMAGE_TYPEeImageType)
{
m_nImageWidth=imW;
m_nImageHeight=imH;
m_eIMAGE_TYPE=eImageType;
m_cSkipValue=0;
for(UBYTE8i=0;i { m_sTrackingObjectTable[i].Status=false; for(SINT16j=0;j m_sTrackingObjectTable[i].initHistogram[j]=0; } m_nFrameCtr=0; m_uTotalTime=0; m_nMaxEstimationTime=0; m_cActiveObject=0; TotalDist=0.0; LastDist=0.0; switch(eImageType) { caseMD_RGBA: m_cSkipValue=4; break; caseMD_RGB: m_cSkipValue=3; break; }; }; CObjectTracker: : ~CObjectTracker() { } //returnspixelvaluesinformat|0|B|G|R|wrtto(x.y) /* ULONG_32CObjectTracker: : GetPixelValues(UBYTE8*frame,SINT16x,SINT16y) { ULONG_32pixelValues=0; pixelValues=*(frame+(y*m_nImageWidth+x)*m_cSkipValue+2)|//0BGR *(frame+(y*m_nImageWidth+x)*m_cSkipValue+1)<<8| *(frame+(y*m_nImageWidth+x)*m_cSkipValue)<<16; return(pixelValues); }*/ //setRGBcomponentswrtto(x.y) voidCObjectTracker: : SetPixelValues(IplImage*r,IplImage*g,IplImage*b,ULONG_32pixelValues,SINT16x,SINT16y) { //*(frame+(y*m_nImageWidth+x)*m_cSkipValue+2)=UBYTE8(pixelValues&0xFF); //*(frame+(y*m_nImageWidth+x)*m_cSkipValue+1)=UBYTE8((pixelValues>>8)&0xFF); //*(frame+(y*m_nImageWidth+x)*m_cSkipValue)=UBYTE8((pixelValues>>16)&0xFF); //setpix32f setpix8c(r,y,x,UBYTE8(pixelValues&0xFF)); setpix8c(g,y,x,UBYTE8((pixelValues>>8)&0xFF)); setpix8c(b,y,x,UBYTE8((pixelValues>>16)&0xFF)); } //returnsboxcolor ULONG_32CObjectTracker: : GetBoxColor() { ULONG_32pixelValues=0; switch(m_cActiveObject) { case0: pixelValues=RGB(255,0,0); break; case1: pixelValues=RGB(0,255,0); break; case2: pixelValues=RGB(0,0,255); break; case3: pixelValues=RGB(255,255,0); break; case4: pixelValues=RGB(255,0,255); break; case5: pixelValues=RGB(0,255,255); break; case6: pixelValues=RGB(255,255,255); break; case7: pixelValues=RGB(128,0,128); break; case8: pixelValues=RGB(128,128,0); break; case9: pixelValues=RGB(128,128,128); break; case10: pixelValues=RGB(255,128,0); break; case11: pixelValues=RGB(0,128,128); break; case12: pixelValues=RGB(123,50,10); break; case13: pixelValues=RGB(10,240,126); break; case14: pixelValues=RGB(0,128,255); break; case15: pixelValues=RGB(128,200,20); break; default: break; } return(pixelValues); } //初始化一个目标的参数 voidCObjectTracker: : ObjectTrackerInitObjectParameters(SINT16x,SINT16y,SINT16Width,SINT16Height) { m_cActiveObject=0; m_sTrackingObjectTable[m_cActiveObject].X=x; m_sTrackingObjectTable[m_cActiveObject].Y=y; m_sTrackingObjectTable[m_cActiveObject].W=Width; m_sTrackingObjectTable[m_cActiveObject].H=Height; m_sTrackingObjectTable[m_cActiveObject].vectorX=0; m_sTrackingObjectTable[m_cActiveObject].vectorY=0; m_sTrackingObjectTable[m_cActiveObject].Status=true; m_sTrackingObjectTable[m_cActiveObject].assignedAnObject=false; } //进行一次跟踪 voidCObjectTracker: : ObjeckTrackerHandlerByUser(IplImage*frame) { m_cActiveObject=0; if(m_sTrackingObjectTable[m_cActiveObject].Status) { if(! m_sTrackingObjectTable[m_cActiveObject].assignedAnObject) { //计算目标的初始直方图 FindHistogram(frame,m_sTrackingObjectTable[m_cActiveObject].initHistogram); m_sTrackingObjectTable[m_cActiveObject].assignedAnObject=true; } else { //在图像上搜索目标 FindNextLocation(frame); DrawObjectBox(frame); } } } //Extractsthehistogramofbox //frame: 图像 //histogram: 直方图 //在图像frame中计算当前目标的直方图histogram //直方图分为两部分,每部分大小4096, //RGB的256*256*256种组合,缩减为16*16*16=4096种组合 //如果目标区域的点是边缘点,则计入直方图的后一部分, //否则计入直方图的前一部分 voidCObjectTracker: : FindHistogram(IplImage*frame,FLOAT32(*histogram)) { SINT16i=0; SINT16x=0; SINT16y=0; UBYTE8E=0; UBYTE8qR=0,qG=0,qB=0; //ULONG_32pixelValues=0; UINT32numberOfPixel=0; IplImage*r,*g,*b; r=cvCreateImage(cvGetSize(frame),frame->depth,1); g=cvCreateImage(cvGetSize(frame),frame->depth,1); b=cvCreateImage(cvGetSize(frame),frame->depth,1); cvCvtPixToPlane(frame,b,g,r,NULL);//dividecolorimageintoseparateplanesr,g,b.Theexactsequencedoesn'tmatter. for(i=0;i histogram[i]=0.0; //forallthepixelsintheregion for(y=max(m_sTrackingObjectTable[m_cActiveObject].Y-m_sTrackingObjectTable[m_cActiveObject].H/2,0);y<=min(m_sTrackingObjectTable[m_cActiveObject].Y+m_sTrackingObjectTable[m_cActiveObject].H/2,m_nImageHeight-1);y++) for(x=max(m_sTrackingObjectTable[m_cActiveObject].X-m_sTrackingObjectTable[m_cActiveObject].W/2,0);x<=min(m_sTrackingObjectTable[m_cActiveObject].X+m_sTrackingObjectTable[m_cActiveObject].W/2,m_nImageWidth-1);x++) { //边缘信息: 当前点与上下左右4点灰度差异是否超过阈值 E=CheckEdgeExistance(r,g,b,x,y); qR=(UBYTE8)pixval8c(r,y,x)/16;//quantizeRcomponent qG=(UBYTE8)pixval8c(g,y,x)/16;//quantizeGcomponent qB=(UBYTE8)pixval8c(b,y,x)/16;//quantizeBcomponent histogram[4096*E+256*qR+16*qG+qB]+=1;//根据边缘信息,累计直方图//HISTOGRAM_LENGTH=8192 numberOfPixel++; } for(i=0;i histogram[i]=histogram[i]/numberOfPixel; //for(i=0;i // printf("histogram[%d]=%d/n",i,histogram[i]); //printf("numberOfPixel=%d/n",numberOfPixel); cvReleaseImage(&r); cvReleaseImage(&g); cvReleaseImage(&b); } //Drawboxaroundobject voidCObjectTracker: : DrawObjectBox(IplImage*frame) { SINT16x_diff=0; SINT16x_sum=0; SINT16y_diff=0; SINT16y_sum=0; SINT16x=0; SINT16y=0; ULONG_32pixelValues=0; IplImage*r,*g,*b; r=cvCreateImage(cvGetSize(frame),frame->depth,1); g=cvCreateImage(cvGetSize(frame),frame->depth,1); b=cvCreateImage(cvGetSize(frame),frame->depth,1); cvCvtPixToPlane(frame,b,g,r,NULL); pixelValues=GetBoxColor(); //thexleftandrightbounds x_sum=min(m_sTrackingObjectTable[m_cActiveObject].X+m_sTrackingObjectTable[m_cActiveObject].W/2+1,m_nImageWidth-1);//右边界 x_diff=max(m_sTrackingObjectTable[m_cActiveObject].X-m_sTrackingObjectTable[m_cActiveObject].W/2,0);//左边界 //theyupperandlowerbounds y_sum=min(m_sTrackingObjectTable[m_cActiveObject].Y+m_sTrackingObjectTable[m_cActiveObject].H/2+1,m_nImageHeight-1);//下边界 y_diff=max(m_sTrackingObjectTable[m_cActiveObject].Y-m_sTrackingObjectTable[m_cActiveObject].H/2,0);//上边界 for(y=y_diff;y<=y_sum;y++) { SetPixelValues(r,g,b,pixelValues,x_diff,y); SetPixelValues(r,g,b,pixelValues,x_diff+1,y); SetPixelValues(r,g,b,pixelValues,x_sum-1,y); SetPixelValues(r,g,b,pixelValues,x_sum,y); } for(x=x_diff;x<=x_sum;x++) { SetPixelValues(r,g,b,pixelValues,x,y_diff); SetPixelValues(r,g,b,pixelValues,x,y_diff+1); SetPixelValues(r,g,b,pixelValues,x,y_sum-1); SetPixelValues(r,g,b,pixelValues,x,y_sum); } cvCvtPlaneToPix(b,g,r,NULL,frame); cvReleaseImage(&r); cvReleaseImage(&g); cvReleaseImage(&b); } //Computesweightsanddrivesthenewlocationofobjectinthenextframe //frame: 图像 //histogram: 直方图 //计算权重,更新目标的坐标 voidCObjectTracker: : FindWightsAndCOM(IplImage*frame,FLOAT32(*histogram)) { SINT16i=0; SINT16x=0; SINT16y=0; UBYTE8E=0; FLOAT32sumOfWeights=0; SINT16ptr=0; UBYTE8qR=0,qG=0,qB=0; FLOAT32 newX=0.0; FLOAT32 newY=0.0; //ULONG_32pixelValues=0; IplImage*r,*g,*b; FLOAT32*weights=newFLOAT32[HISTOGRAM_LENGTH]; for(i=0;i { if(histogram[i]>0.0) weights[i]=m_sTrackingObjectTable[m_cActiveObject].initHistogram[i]/histogram[i];//qu/pu(y0) else weights[i]=0.0; } r=cvCreateImage(cvGetSize(frame),frame->depth,1); g=cvCreateImage(cvGetSize(frame),frame->depth,1); b=cvCreateImage(cvGetSize(frame),frame->depth,1); cvCvtPixToPlane(frame,b,g,r,NULL);//dividecolorimageintoseparateplanesr,g,b.Theexactsequencedoesn'tmatter. for(y=max(m_sTrackingObjectTable[m_cActiveObject].Y-m_sTrackingObjectTable[m_cActiveObject].H/2,0);y<=min(m_sTrackingObjectTable[m_cActiveObject].Y+m_sTrackingObjectTable[m_c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- meanshift 可以识别物体 可以 识别 物体