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