引言:
API:
代码展示:
#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
Mat src;
Mat graysrc;
int maxConnerNum = 30;
int maxTrackbarNum = 500;
RNG rng(getTickCount());
void Connerdecetor_demo(int pos, void* data);
int main()
{
//待检测图像
src = imread("F:\\visual studio\\Image\\building1.jpg");
if (src.empty())
{
cout << "Can't load the image" << endl;
return -1;
}
imshow("src", src);
//转化为灰度图
cvtColor(src, graysrc, COLOR_BGR2GRAY);
namedWindow("dst", WINDOW_AUTOSIZE);
createTrackbar("最大角点数", "dst", &maxConnerNum, maxTrackbarNum , Connerdecetor_demo);
Connerdecetor_demo(0, 0);
waitKey(0);
}
void Connerdecetor_demo(int pos, void* data)
{
vector<Point2f> corners;
double qualityLevel = 0.01;//角点检测可接受的最小特征值
double minDistance = 10;//角点之间的最小距离
int blocksize = 3; //计算导数自相关矩阵时指定的邻域范围
bool useharris = false; //是否使用harris角点检测
double k = 0.04; //harris所用参数
//Shi-Tomasi角点检测
goodFeaturesToTrack(graysrc, corners, maxConnerNum, qualityLevel, minDistance, Mat(), 3, false, 0.04);
//绘制
Mat dst = graysrc.clone();
cvtColor(dst, dst, COLOR_GRAY2BGR);
for (int i = 0; i < corners.size(); i++)
{
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
circle(dst, corners[i], 2, color, 2, LINE_AA, 0);
}
imshow("dst", dst);
}
效果展示: