TLD特征点跟踪TLD(Tracking-Learning-Detection)

来源:互联网 发布:网络上赌博的托 编辑:程序博客网 时间:2024/06/07 20:44

 TLDTracking-Learning-Detection)实现

         TLD(Tracking-Learning-Detection)是英国萨里大学的一个捷克籍博士生Zdenek Kalal在其攻读博士学位期间提出的一种新的单目标长时间(long term tracking)跟踪算法。该算法与传统跟踪算法的显著区别在于将传统的跟踪算法和传统的检测算法相结合来解决被跟踪目标在被跟踪过程中发生的形变、部分遮挡等问题。同时,通过一种改进的在线学习机制不断更新跟踪模块的“显著特征点”和检测模块的目标模型及相关参数,从而使得跟踪效果更加稳定、鲁棒、可靠。

(作者网站的链接http://info.ee.surrey.ac.uk/Personal/Z.Kalal/)

TLD跟踪的步骤:

(1)读取两幅相邻的影像对(本文以相邻的视频帧为例)

 frame1 = cvQueryFrame(m_capture) ;  

(2)对影像对进行灰度转换

cvCvtColor( imgi,img_prev ,CV_BGR2GRAY);  

(3)采用GFTT特征点检测算法进行特征点检测

cvGoodFeaturesToTrack(……)
(4)亚像素级角点定位
cvFindCornerSubPix(……);
(5)特征点追踪cvCalcOpticalFlowPyrLK(……)

opencv函数介绍

(1)
void cvGoodFeaturesToTrack( const CvArr* image, CvArr* eig_image, CvArr* temp_image,
CvPoint2D32f* corners, int* corner_count,
double quality_level, double min_distance,
const CvArr* mask=NULL,
int block_size = NULL,
int use_harris = 0,
double k = 0.4
);
image输入图像,8-位或浮点32-比特,单通道;eig_image临时浮点32-位图像,尺寸与输入图像一致;temp_image另外一个临时图像,格式与尺寸与 eig_image 一致;corners输出参数,检测到的角点;corner_count输出参数,检测到的角点数目;quality_level最大最小特征值的乘法因子。定义可接受图像角点的最小质量因子。;min_distance限制因子。得到的角点的最小距离。使用 Euclidian 距离;maskROI:感兴趣区域。函数在ROI中计算角点,如果 mask 为 NULL,则选择整个图像。
(2)
void cvFindCornerSubPix(
const CvArr* image,
CvPoint2D32f* corners,
int count,
CvSize win,
CvSize zero_zone,
CvTermCriteria criteria
);
image输入的图像,必须是8位的灰度或者彩色图像;corners输入角点的初始坐标,也存储精确的输出坐标;count角点数目;win搜索窗口的一半尺寸。如果win=(5,5)那么使用(5*2+1)×(5*2+1)=11×11大小的搜索窗口;zero_zone死区的一半尺寸,死区为不对搜索区的中央位置做求和运算的区域。它是用来避免自相关矩阵出现的某些可能的奇异性。当值为(-1,-1)表示没有死区;criteria求角点的迭代过程的终止条件。即角点位置的确定,要么迭代数大于某个设定值,或者是精确懂达到某个设定值。criteria可以是最大迭代数目,或者是设定的精确度,也可以是它们的组合。
(3)
void cvCalcOpticalFlowPyrLK( 
const CvArr* prev, 
const CvArr* curr, 
CvArr* prev_pyr, 
CvArr* curr_pyr, 
const CvPoint2D32f* prev_features, 
CvPoint2D32f* curr_features, 
int count, 
CvSize win_size, 
int level, 
char* status, 
float* track_error, 
CvTermCriteria criteria, 
int flags );
prev在时间 t 的第一帧;curr在时间 t + dt 的第二帧;prev_pyr第一帧的金字塔缓存. 如果指针非 NULL , 则缓存必须有足够的空间来存储金字塔从层 1 到层 #level 的内容。尺寸 (image_width+8)*image_height/3 比特足够了;curr_pyr与 prev_pyr 类似, 用于第二帧;prev_features需要发现光流的点集;curr_features包含新计算出来的位置的 点集;count特征点的数目;win_size每个金字塔层的搜索窗口尺寸;level最大的金字塔层数。如果为 0 , 不使用金字塔 (即金字塔为单层), 如果为 1 , 使用两层,下面依次类推;status数组。如果对应特征的光流被发现,数组中的每一个元素都被设置为 1, 否则设置为 0。error双精度数组,包含原始图像碎片与移动点之间的差。为可选参数,可以是 NULL .;criteria准则,指定在每个金字塔层,为某点寻找光流的迭代过程的终止条件。

C++主要代码如下:

           m_capture = cvCaptureFromAVI(m_filename) ;              //<span style="font-family: Calibri;">m_filename为</span>视频文件路径<pre name="code" class="cpp" style="color: rgb(0, 0, 255); font-size: 18px; line-height: 26px;">
           frame1 = cvQueryFrame(m_capture) ;                      //获取一帧图像
imgi = cvCreateImage(cvGetSize(frame), 8, 3 ) ; //建立imgi cvCopyImage(frame,imgi) ; //将前一帧存入imgiframe1 = cvQueryFrame(m_capture) ;if (frame != NULL){ cvReleaseImage(&frame) ;}frame = cvCreateImage(I_size1, frame1->depth, frame1->nChannels) ;cvResize(frame1, frame , CV_INTER_NN) ;imgi1 = cvCreateImage( cvGetSize(frame), 8, 3 ); //建立imgi1cvCopyImage(frame,imgi1); //将当前帧存入imgi1

IplImage* img_prev = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,1) ;  cvCvtColor( imgi,img_prev ,CV_BGR2GRAY);  IplImage* img_curr = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,1) ;  cvCvtColor( imgi1,img_curr ,CV_BGR2GRAY);  IplImage* img_eig = cvCreateImage(cvGetSize(frame),IPL_DEPTH_32F,1) ;  IplImage* img_temp = cvCreateImage(cvGetSize(frame),IPL_DEPTH_32F,1) ;                 //用GFTT检测特征点cvGoodFeaturesToTrack(  img_prev,  img_eig,  img_temp,  features_prev,  &corner_count,  0.01,  5.0,  0,  3,  0,  0.4  );  cvFindCornerSubPix(  img_prev,  features_prev,  corner_count,  cvSize(10,10),  cvSize(-1,-1),  cvTermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER,20,0.03)  ); CvSize pyr_sz = cvSize( frame->width + 8 ,frame->height / 3 ) ;  IplImage* pyr_prev = cvCreateImage(cvGetSize(frame),IPL_DEPTH_32F,1) ;  IplImage* pyr_cur = cvCreateImage(cvGetSize(frame),IPL_DEPTH_32F,1) ;  //追踪特征点cvCalcOpticalFlowPyrLK(  img_prev,  img_curr,  pyr_prev,  pyr_cur,  features_prev,           features_cur,  corner_count,  cvSize(10,10),  5,  feature_found,  feature_errors,  cvTermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER,20,0.3),  0  );  //features_cur[];features_prev[]即为追踪到的角点。



0 0
原创粉丝点击