Harris、Shi-Tomasi、SubPix

Harris

#include<opencv2/opencv.hpp>
//特征值点检测


//Harris角点检测
int main() 
{
	cv::Mat img = cv::imread("D://pic//GCalibData//536.230_0.000.bmp", 0);
	cv::Mat gray = img;
	//cv::cvtColor(img, gray, CV_BGR2GRAY);
	//cv::Mat har(gray.size(),CV_32FC1);
	/*
		src:输入单通道8位或浮点图像;
		blockSize:角点检测中指定区域的大小;
		ksize:Sobel求导中使用的窗口大小;
		k:取值参数为 [0,04,0.06];
	*/

	/*
	//1、Harris
	cv::cornerHarris(gray, har, 2, 3, 0.04);
	cv::Mat nor;
	cv::normalize(har, nor, 0, 255, cv::NORM_MINMAX, CV_32FC1, cv::Mat()); //归一化
	cv::Mat scale;
	cv::convertScaleAbs(nor,scale);
	double maxValue = 0;
	cv::minMaxLoc(nor, NULL, &maxValue);
	//std::cout << maxValue << std::endl;
	for (int i = 0; i < img.rows; i++) {

		double* h = nor.ptr<double>(i);
		cv::Vec3b* data = img.ptr<cv::Vec3b>(i);

		for (int j = 0; j < img.cols; j++) {
			//std::cout << h[j] << std::endl;
			if (h[j] > 130) {
				data[j].val[0] = 0;
				data[j].val[1] = 0;
				data[j].val[2] = 255;
			}

		}
	}

	cv::namedWindow("img", CV_WINDOW_AUTOSIZE);
	cv::imshow("img", img);
	cv::waitKey(0);
	*/
	//2、Shi-Tomasi算法:确定图像强角点
	std::vector<cv::Point2f> corners;//提供初始角点的坐标位置和精确的坐标的位置
	int maxcorners = 10000;
	double qualityLevel = 0.01;  //角点检测可接受的最小特征值
	double minDistance = 10;	//角点之间最小距离
	int blockSize = 3;//计算导数自相关矩阵时指定的领域范围
	double  k = 0.04; //权重系数

	goodFeaturesToTrack(gray, corners, maxcorners, qualityLevel, 
		minDistance, cv::Mat(), blockSize, false, k);
	//Mat():表示感兴趣区域;false:表示不用Harris角点检测

	//输出角点信息
	std::cout << "角点信息为:" << corners.size() << std::endl;

	//绘制角点
	cv::RNG rng(12345);
	for (unsigned i = 0; i < corners.size(); i++)
	{
		circle(img, corners[i], 2, cv::Scalar(0, 0, 255), -1, 8, 0);

		/*
		circle(img, corners[i], 2, cv::Scalar(rng.uniform(0, 255),
			rng.uniform(0, 255), rng.uniform(0, 255)), -1, 8, 0);
		*/

		//std::cout << "角点坐标:" << corners[i] << std::endl;
	}

	/*
	//3、寻找亚像素角点
	cv::Size winSize = cv::Size(5, 5);  //搜素窗口的一半尺寸
	cv::Size zeroZone = cv::Size(-1, -1);//表示死区的一半尺寸
	//求角点的迭代过程的终止条件,即角点位置的确定
	cv::TermCriteria criteria = cv::TermCriteria(
		CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 40, 0.001);
	//TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 40, 0.001);

	cornerSubPix(gray, corners, winSize, zeroZone, criteria);


	//输出角点信息
	std::cout << "角点信息为:" << corners.size() << std::endl;

	//绘制角点
	for (unsigned i = 0; i < corners.size(); i++)
	{
		circle(img, corners[i], 2, cv::Scalar(0, 255, 255), -1, 8, 0);
		std::cout << "角点坐标:" << corners[i] << std::endl;
	}
	*/


	cv::waitKey(0);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值