Meanshift算法之再思考

其实Meanshift算法的核心思想就是迭代,通过迭代找到局部极大值。

如果初始区域设置不合理的话,Meanshift是无法成功找到局部极大值的。

比如下面的这个例子,我设置的初始区域中的像素值全部为0,所以Meanshift就无法找到像素值增大的方向,

最终也就找不到局部极大值。

Meanshift算法之再思考_第1张图片

如果我的初始区域设置合理的话,情况则是这样的(红方框为初始区域,绿方框为局部极大值区域):

Meanshift算法之再思考_第2张图片

#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;
}


你可能感兴趣的:(opencv,MeanShift)