其实Meanshift算法的核心思想就是迭代,通过迭代找到局部极大值。
如果初始区域设置不合理的话,Meanshift是无法成功找到局部极大值的。
比如下面的这个例子,我设置的初始区域中的像素值全部为0,所以Meanshift就无法找到像素值增大的方向,
最终也就找不到局部极大值。
如果我的初始区域设置合理的话,情况则是这样的(红方框为初始区域,绿方框为局部极大值区域):
#include <opencv2/opencv.hpp> using namespace cv; using namespace std; typedef unsigned int uint; int main() { Mat backproj = imread("1.png", 0); Mat imgColor; cvtColor(backproj, imgColor, CV_GRAY2BGR); //初始区域合理的情况 Rect rect(400, 300, 50, 50); ////初始区域不合理的情况 //Rect rect(0, 300, 50, 50); Rect srcRect = rect; TermCriteria criteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 1000, 0.001); meanShift(backproj, rect, criteria); if (srcRect == rect) { //如果两个矩形一样,说明Meanshift无法进行迭代 cout << "失败! Meanshift无法迭代找到局部极大值!" << endl; rectangle(imgColor, srcRect, Scalar(255, 0, 0), 2); imwrite("Fail.jpg", imgColor); } else { cout << "成功! Meanshift成功迭代找到局部极大值!" << endl; rectangle(imgColor, srcRect, Scalar(0, 0, 255), 2); rectangle(imgColor, rect, Scalar(0, 255, 0), 2); imwrite("Success.jpg", imgColor); } imshow("Result", imgColor); waitKey(0); return 0; }