Opencv特征提取与检测学习02:Shi-Tomasi角点检测理论
概念
基于harris角点检测的理论,改进了一下计算响应的公式,
优点:
1.计算速度大大加快
2.能基于我们想要的检测角点的数量,快速检测
API介绍
1.k就是响应系数,一般0.04~0.06;
2.qualityLevel一般取0.01;
3.bool useHarrisDetector是否使用harris角点检测
代码演示
// Opencv 文件.cpp :
#include "pch.h"
#include<opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
/*Harris角点检测
double k = 0.04;
int blocksize = 3;
int ksize = 3;
int thresh=130;//阈值
int max_thresh=255;*/
//Shi-tomasi角点检测
int blocksize = 3;//矩阵M的大小
double k = 0.04;//响应系数
bool useharris = false;//不使用Harris角点检测
int corners=10;//角点数
int max_corners=255;//最大的角点数
double qualityLevel = 0.01;
double minDistance = 10;
void Callback_demo(int, void*);
Mat gray;
Mat src1;
char OUTPUT_WIN[] = "shitomasi_corner";
RNG rng;
int main()
{
src1 = imread("E:\\360downloads\\home.jpg");
if (!src1.data) {//!src.data与src.empty()一样;
printf("failure to load the image1 ");
return -1;
}
namedWindow(OUTPUT_WIN, WINDOW_AUTOSIZE);
imshow("src1", src1);
cvtColor(src1,gray, COLOR_BGR2GRAY);
createTrackbar("max_corners", OUTPUT_WIN, &corners, max_corners, Callback_demo);
Callback_demo(0, 0);
waitKey(0);
return 0;
}
void Callback_demo(int, void*) {
//定义一个角点数组,存储计算出的角点
vector<Point2f> corner;
goodFeaturesToTrack(gray, corner, corners, qualityLevel, minDistance, Mat(), blocksize, useharris, k);
//根据corner画出对应的角点
Mat resultImage = gray.clone();
cvtColor(resultImage, resultImage, COLOR_GRAY2BGR);//为了显示更明显,变成灰色的rgb图像
for (int t = 0; t < corner.size(); t++) {
circle(resultImage, corner[t], 2, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), 2, 8);
}
printf("%d\n", corner.size());
imshow(OUTPUT_WIN, resultImage);
}