c
复制代码
goodFeaturesToTrack(src,corners,maxCorners,quality_level,min_distance,Mat(),block_size,use_harris,k);
1.src:输入图像,输入的图像必须是8位或32位单通道图像
2.corners:输出的角点使用vector<Point2f>存储
3.maxCorners:最大角点数目,也就是corners集合中能存放的最大交点数,也就是最强的前corners个角点
4.quality_level:质量水平系数,是0.01~1之间的系数,其中系数越大检测到的角点就越少,反之亦然
5.min_distance:角点之间的最小距离,小于此距离的角点会被忽略,距离越大有可能检测到的角点就越少
6.Mat()掩码,mask=0忽略,基础用法忽略即可
7.block_size:Sobel算子,使用的邻域,四邻域,八邻域等 3,5,7
9.user_harris:是否使用harris检测,true是,false否
10.k:harris角点检测时使用一般为0.04,user_harris=false时此参数会被忽略
c
复制代码
#include <opencv2/opencv.hpp> // 包含OpenCV库的主要头文件
#include <iostream> // 包含标准输入输出流的头文件
using namespace cv; // 使用cv命名空间,避免每次调用OpenCV函数时都得加上cv::
using namespace std; // 使用std命名空间,避免每次调用C++标准库函数时都得加上std::
int num_corners = 25; // 设置初始要检测的角点数量为25个
int max_corners = 200; // 设置可检测的最大角点数量为200个
const char* output_title = "ShiTomasi Detector"; // 定义输出窗口的标题
void ShiTomasi_Demo(int, void*); // 声明回调函数,用于更新角点检测结果
Mat src, gray_src; // 定义两个矩阵变量,src用于存储原始彩色图像,gray_src用于存储灰度图像
RNG rng(12345); // 创建一个随机数生成器,用于给角点标记颜色
// 主函数
int main(int argc, char** argv) {
src = imread("D:/vcprojects/images/home.jpg"); // 加载指定路径的图像到src矩阵中
if (src.empty()) { // 检查图像是否成功加载
printf("could not load image...\n"); // 如果未成功加载,则打印错误信息
return -1; // 并退出程序,返回-1表示错误
}
namedWindow("input image", CV_WINDOW_AUTOSIZE); // 创建一个名为"input image"的窗口,大小自动调整
imshow("input image", src); // 在"input image"窗口中显示原始图像
cvtColor(src, gray_src, COLOR_BGR2GRAY); // 将彩色图像转换为灰度图像
namedWindow(output_title, CV_WINDOW_AUTOSIZE); // 创建一个用于显示角点检测结果的窗口
createTrackbar("Num Corners:", output_title, &num_corners, max_corners, ShiTomasi_Demo); // 创建滑动条以动态改变角点数量,并绑定到回调函数
ShiTomasi_Demo(0, 0); // 调用回调函数初始化显示
waitKey(0); // 等待按键事件(无限期等待)
return 0; // 程序正常结束,返回0
}
// 回调函数,当滑动条值变化时被调用
void ShiTomasi_Demo(int, void*) {
if (num_corners < 5) { // 确保角点数量不少于5个
num_corners = 5;
}
vector<Point2f> corners; // 定义一个vector容器用于存储检测到的角点坐标
double qualityLevel = 0.01; // 设置质量水平阈值,决定最小特征值的下限
double minDistance = 10; // 设置角点之间的最小距离
int blockSize = 3; // 设置计算导数自相关矩阵时考虑的邻域大小
bool useHarris = false; // 设置是否使用Harris检测器,默认不使用
double k = 0.04; // Harris角点检测器使用的自由参数k值
Mat resultImg = gray_src.clone(); // 复制灰度图像到resultImg中,作为绘制角点的基础图
cvtColor(resultImg, resultImg, COLOR_GRAY2BGR); // 将灰度图像转换回彩色图像,以便能够绘制彩色圆圈标记角点
goodFeaturesToTrack(gray_src, corners, num_corners, qualityLevel, minDistance, Mat(), blockSize, useHarris, k); // 检测角点并将它们存入corners向量中
printf("Number of Detected Corners: %d\n", corners.size()); // 打印检测到的角点数量
for (size_t t = 0; t < corners.size(); t++) { // 遍历所有检测到的角点
circle(resultImg, corners[t], 2, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), 2, 8, 0); // 在每个角点位置绘制彩色圆圈
}
imshow(output_title, resultImg); // 在"ShiTomasi Detector"窗口中显示带有角点标记的结果图像
}