OpenCV_检测兴趣点

在计算机视觉领域,兴趣点(也称关键点或特征点)的概念已经得到了广泛的应用,包括目标识别、图像配准、视觉跟踪、三维重建等。这个概念的原理是,从图像中选取某些特征点并对图像进行局部分析,而非观察整幅图像。

*检测图像中的角点

角点是很容易在图像中定位的局部特征,并且大量存在于人造物体中。角点的价值在于它是两条边缘线的接合点,是一种二维特征,可以被精确地定位(即使是子像素级精度)

Harris特征检测是检测角点地经典方法。

OpenCV中检测Harris角点地基本函数是cv::cornerHarris.调用该函数时输入一个图像,返回地结果是一个浮点型图像,其中每个像素点表示角点强度

原图:


效果:


代码:

HarrisDetector类:

class HarrisDetecter
{
private:
	cv::Mat cornerStrength;		//32位浮点数型的角点强度图像
	cv::Mat cornerTh;		//32位浮点数型的阈值化角点图像
	cv::Mat localMax;		//局部最大值图像
	int neighbourhood;		//平滑导数的邻域尺寸
	int aperture;			//梯度计算的口径
	double k;				//Harris参数
	double maxStrength;		//阈值计算的最大强度
	double threshold;		//计算得到的阈值
	int nonMaxSize;			//非最大抑制的邻域尺寸
	cv::Mat kernel;			//非最大抑制内核
public:
	HarrisDetecter() :neighbourhood(3), aperture(3), k(0.01), maxStrength(0.0), threshold(0.01), nonMaxSize(3)
	{
		setLocalMaxWindowSize(nonMaxSize);
	}
	void setLocalMaxWindowSize(int size)
	{
		nonMaxSize = size;
		kernel.create(nonMaxSize, nonMaxSize, CV_8U);
	}
	void detect(const cv::Mat& image)
	{
		cv::cornerHarris(image, cornerStrength, neighbourhood, aperture, k);
		//计算内部阈值
		double minStrength;
		cv::minMaxLoc(cornerStrength, &minStrength, &maxStrength);
		//检测局部最大值
		cv::Mat dilated;
		cv::dilate(cornerStrength, dilated, cv::Mat());
		cv::compare(cornerStrength, dilated, localMax, cv::CMP_EQ);
	}
	//用Harris值得到角点分布图
	cv::Mat getCornerMap(double qualityLevel)
	{
		cv::Mat cornerMap;
		threshold = qualityLevel*maxStrength;
		cv::threshold(cornerStrength, cornerTh, threshold, 255, cv::THRESH_BINARY);
		cornerTh.convertTo(cornerMap, CV
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值