1、int i, j, opti, optj;SINT16 scale3=-3, 3, 0;FLOAT32 dist, optdist;SINT16 h, w, optX, optY;/try no-scalingFindNextFixScale(frame);/找出目标的下一个大致范围optdist=LastDist;optX=m_sTrackingObjectTablem_cActiveObject.X;optY=m_sTrackingObjectTablem_cActiveObject.Y;/try one of the 9 possible scalingi=rand()*2/RAND_M
2、AX;j=rand()*2/RAND_MAX;h=m_sTrackingObjectTablem_cActiveObject.H;w=m_sTrackingObjectTablem_cActiveObject.W;if(h+scalei10 & w+scalej h+scaleim_nImageHeight/2 & w+scalejm_nImageWidth/2) m_sTrackingObjectTablem_cActiveObject.H=h+scalei; m_sTrackingObjectTablem_cActiveObject.W=w+scalej; FindNextFixScale
3、(frame); if( (dist=LastDist) n, dist); else /no scaling is better m_sTrackingObjectTablem_cActiveObject.X=optX; m_sTrackingObjectTablem_cActiveObject.Y=optY; m_sTrackingObjectTablem_cActiveObject.H=h; m_sTrackingObjectTablem_cActiveObject.W=w;TotalDist+=optdist; /the latest distance);这里仍然在跟踪的基础上讲解me
4、an shift。首先还是把mean shift的原理用数学公式说一下吧。1、目标模型,算法采用的是特征值的加权概率分布来描述目标模型。这应该是模式识别中主要描述目标的模型,不同于自动控制理论中采用的状态方程。目标模型共m个特征值(可以理解为像素灰度值)其中X0是窗口中心点向量值(可能为RBG 向量或者灰度值), Xi 是窗口内第i 点向量值。C 为归一化常数,保障q1+q2+q3+qm=1,H 为核函数的带宽向量。M 为特征值的个数,对应于图像处理可以理解为灰度等级划分的个数,从而特征值u 为对应的灰度等级。d 函数为脉冲函数,保证只有具有u 特征值的像素才对概率分布作出贡献。从而k函数可以
5、理解为u 灰度值的一个加权频数。2、 匹配对象,也采用特征值加权概率分布其中,Y 为匹配对象的中心, Xi 是匹配窗口内第i 点向量值, Hh 为匹配窗口的核函数带宽向量。 Ch 为匹配窗口特征向量的归一化常数。3、 匹配对象与目标模型的相似程度,相似函数可采用Bhattacharyya 函数4、 匹配过程就是寻找相似函数最大值的寻优过程,Mean-Shift 采用的是梯度下降法。首先将(Y) 在(Y0)附近进行泰勒级数展开,取前两项。即:要使得(Y) 向最大值迭代,只要Y 的搜索方向与梯度方向一致即可,通过求导可得到Y0的梯度方向为:为权值。因此如果如下确定Y1,那么Y1-Y0将与梯度方向一
6、致。以上为mean shift的数学原理。有关文字的叙述已经在上一篇中提到了。用mean shift来跟踪属于确定性算法,粒子滤波器属于统计学方法。meanshift跟踪算法相对于粒子滤波器来说可能实时性更好一些,但是跟踪的准确性在理论上还是略逊于粒子滤波器的。mean shift跟踪的的实质就是通过对应的模板来确定目标的下一个位置。通过迭代找到新的中心点(即是目标的新的位置点)。有关跟踪的code如下所示:/*Bilkent University:Mean-shift Tracker based Moving Object Tracker in VideoVersion: 1.0Compil
7、er: Microsoft Visual C+ 6.0 (tested in both debug and release mode)Modified by Mr Zhou*/#include ObjectTracker.hutils.h#include stdio.hstdlib.h/*#define GetRValue(rgb) (UBYTE8) (rgb) #define GetGValue(rgb) (UBYTE8) (ULONG_32) (rgb) 8) #define GetBValue(rgb) (UBYTE8) (rgb) 16) */#define RGB(r, g ,b)
8、(ULONG_32) (UBYTE8) (r) | (UBYTE8) (g) 8) | (ULONG_32) (UBYTE8) (b) 16) #define min(a, b) (a) (b) #define MEANSHIFT_ITARATION_NO 5#define DISTANCE_ITARATION_NO 1#define ALPHA 1#define EDGE_DETECT_TRESHOLD 32/1 给定目标的初始位置和尺寸, 计算目标在图像中的直方图;2 输入新图像, 迭代直到收敛:计算图像上对应区域的新直方图;新直方图与目标直方图比较,计算权重;根据权重,计算图像上对应区域
9、的形心/质心;根据形心,修正目标位置;直方图分为两部分, 每部分大小4096,RGB的256*256*256种组合, 缩减为16*16*16=4096种组合. 如果目标区域的点是边缘点, 则计入直方图的后一部分, 否则计入直方图的前一部分. CObjectTracker:CObjectTracker(INT32 imW,INT32 imH,IMAGE_TYPE eImageType)m_nImageWidth = imW;m_nImageHeight = imH;m_eIMAGE_TYPE = eImageType;m_cSkipValue = 0;for (UBYTE8 i=0;iMAX_O
10、BJECT_TRACK_NUMBER;i+)/初始化各个目标 m_sTrackingObjectTablei.Status = false; for(SINT16 j=0;jHISTOGRAM_LENGTH;j+) m_sTrackingObjectTablei.initHistogramj = 0;m_nFrameCtr = 0;m_uTotalTime = 0;m_nMaxEstimationTime = 0;m_cActiveObject = 0;TotalDist=0.0;LastDist=0.0;switch (eImageType) case MD_RGBA: m_cSkipVal
11、ue = 4 ;break ; case MD_RGB:m_cSkipValue = 3 ; break ;CObjectTracker()/returns pixel values in format |0|B|G|R| wrt to (x.y)ULONG_32 CObjectTracker:GetPixelValues(UBYTE8 *frame,SINT16 x,SINT16 y)ULONG_32 pixelValues = 0;pixelValues = *(frame+(y*m_nImageWidth+x)*m_cSkipValue+2)|/0BGR *(frame+(y*m_nIm
12、ageWidth+x)*m_cSkipValue+1) 8| *(frame+(y*m_nImageWidth+x)*m_cSkipValue) 8) &/ *(frame+(y*m_nImageWidth+x)*m_cSkipValue) = UBYTE8(pixelValues 16) &/setpix32fsetpix8c(r, y, x, UBYTE8(pixelValues & 0xFF);setpix8c(g, y, x, UBYTE8(pixelValues setpix8c(b, y, x, UBYTE8(pixelValues / returns box color GetB
13、oxColor()switch(m_cActiveObject)case 0:pixelValues = RGB(255,0,0);break;case 1:pixelValues = RGB(0,255,0);case 2:pixelValues = RGB(0,0,255);case 3:pixelValues = RGB(255,255,0);case 4:pixelValues = RGB(255,0,255);case 5:pixelValues = RGB(0,255,255);case 6:pixelValues = RGB(255,255,255);case 7:pixelVa
14、lues = RGB(128,0,128);case 8:pixelValues = RGB(128,128,0);case 9:pixelValues = RGB(128,128,128);case 10:pixelValues = RGB(255,128,0);case 11:pixelValues = RGB(0,128,128);case 12:pixelValues = RGB(123,50,10);case 13:pixelValues = RGB(10,240,126);case 14:pixelValues = RGB(0,128,255);case 15:pixelValue
15、s = RGB(128,200,20);default:/初始化一个目标的参数 ObjectTrackerInitObjectParameters(SINT16 x,SINT16 y,SINT16 Width,SINT16 Height) m_sTrackingObjectTablem_cActiveObject.X = x; m_sTrackingObjectTablem_cActiveObject.Y = y; m_sTrackingObjectTablem_cActiveObject.W = Width; m_sTrackingObjectTablem_cActiveObject.H =
16、 Height; m_sTrackingObjectTablem_cActiveObject.vectorX = 0; m_sTrackingObjectTablem_cActiveObject.vectorY = 0; m_sTrackingObjectTablem_cActiveObject.Status = true; m_sTrackingObjectTablem_cActiveObject.assignedAnObject = false;/进行一次跟踪ObjeckTrackerHandlerByUser(IplImage *frame) /计算目标的初始直方图 /在图像上搜索目标/
17、Extracts the histogram of box/frame: 图像/histogram: 直方图/在图像frame中计算当前目标的直方图histogram/直方图分为两部分,每部分大小4096,/RGB的256*256*256种组合,缩减为16*16*16=4096种组合/如果目标区域的点是边缘点,则计入直方图的后一部分,/否则计入直方图的前一部分FindHistogram(IplImage *frame, FLOAT32 (*histogram)SINT16 i = 0;SINT16 x = 0;SINT16 y = 0;UBYTE8 E = 0;UBYTE8 qR = 0,qG
18、 = 0,qB = 0;/ ULONG_32 pixelValues = 0;UINT32 numberOfPixel = 0;IplImage* r, * g, * b;r = cvCreateImage( cvGetSize(frame), frame-depth, 1 );g = cvCreateImage( cvGetSize(frame), frame-b = cvCreateImage( cvGetSize(frame), frame-cvCvtPixToPlane( frame, b, g, r, NULL ); /divide color image into separate
19、 planes r, g, b. The exact sequence doesnt matter.for (i=0;i+) /reset all histogram histogrami = 0.0;/for all the pixels in the regionfor (y=max(m_sTrackingObjectTablem_cActiveObject.Y-m_sTrackingObjectTablem_cActiveObject.H/2,0);y=min(m_sTrackingObjectTablem_cActiveObject.Y+m_sTrackingObjectTablem_
20、cActiveObject.H/2,m_nImageHeight-1);y+) for (x=max(m_sTrackingObjectTablem_cActiveObject.X-m_sTrackingObjectTablem_cActiveObject.W/2,0);x=min(m_sTrackingObjectTablem_cActiveObject.X+m_sTrackingObjectTablem_cActiveObject.W/2,m_nImageWidth-1);x+) /边缘信息: 当前点与上下左右4点灰度差异是否超过阈值 E = CheckEdgeExistance(r, g, b,x,y); qR = (UBYTE8)pixval8c( r, y, x )/16;/quantize R component qG = (UBYTE8)pixval8c( g, y, x )/16;/quantize G component qB = (UBYTE8)pixval8c( b, y, x )/16;/quantize B component histogram4096*E+256*q
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1