均值漂移前要得到目标的Mat(choseAim)以及Rect(rect)
首先计算第一次的dstHist
然后将dstHist,rect,image(待处理图原图,下一帧)扔到均值漂移函数中
之后循环即可
//均值漂移参数
Mat choseAim;
Mat targetImageHSV;
int histSize=200;
float histR[]={0,255};
const float *histRange=histR;
int channels[]={0,1};
Mat dstHist;
//计算dstHist,以便均值漂移
cvtColor(choseAim, targetImageHSV, CV_RGB2HSV);
calcHist(&targetImageHSV, 2, channels, Mat(), dstHist, 1, &histSize, &histRange, true, false);
normalize(dstHist, dstHist, 0, 255, CV_MINMAX);
//************************************
// Description: 均值漂移函数
// Method: meanShiftTracking
// FullName: meanShiftTracking
// Access: public
// Parameter: Mat image 待检测图像
// Parameter: Rect & rect 上一帧目标位置
// Parameter: Mat dstHist 上一帧目标hist
// Returns: void
// Author: 小白
// Date: 2017/07/03
//************************************
void meanShiftTracking(Mat image, Rect& rect, Mat dstHist)
{
Mat imageHSV;
Mat calcBackImage;
cvtColor(image, imageHSV, CV_RGB2HSV);
calcBackProject(&imageHSV, 2, channels, dstHist, calcBackImage, &histRange); //反向投影
TermCriteria criteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 1000, 0.001);
meanShift(calcBackImage, rect, criteria);
Mat imageROI=imageHSV(rect); //更新模板
targetImageHSV=imageHSV(rect);
calcHist(&imageROI, 2, channels, Mat(), dstHist, 1, &histSize, &histRange);
normalize(dstHist, dstHist, 0.0, 1.0, NORM_MINMAX); //归一化
rectangle(image, rect, Scalar(0, 0, 255), 3); //目标绘制
}