好不容易元旦两天假,学习了一下goodFeaturesToTrack 和 cornerHarris的使用。
#include "pch.h"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
void cornerHarrisTest();
void goodFeaturesToTrackTest();
int main(int argc, char** argv)
{
goodFeaturesToTrackTest();
cornerHarrisTest();
waitKey(0);
return 0;
}
void goodFeaturesToTrackTest() {
int maxCorners = 20; //返回的最大角点数
vector<Point2f> corners; //角点容器
double qualityLevel = 0.01; //可接受的最低角点图像质量
double minDistance = 10; //角点之间的最短欧式距离
int blockSize = 3, gradientSize = 3;//计算的窗口大小和微分大小
bool useHarrisDetector = false;
double k = 0.04;
Mat src = imread("D://9.jpg"), src_gray;
cvtColor(src, src_gray, COLOR_BGR2GRAY); //转灰度图
goodFeaturesToTrack(src_gray, //检测角点
corners,
maxCorners,
qualityLevel,
minDistance,
Mat(),
blockSize,
gradientSize,
useHarrisDetector,
k);
for (size_t i = 0; i < corners.size(); i++)
{
circle(src_gray, corners[i], 4, Scalar(0), 2, 8, 0); //圈出角点
}
imshow("goodFeaturesToTrackTest", src_gray);
}
void cornerHarrisTest() {
Mat src_gray, dst_norm, dst_norm_scaled;
Mat src = imread("D://9.jpg");
Mat dst = Mat::zeros(src.size(), CV_32FC1);
cvtColor(src, src_gray, COLOR_BGR2GRAY); //转灰度图
cornerHarris(src_gray, dst, 2, 3, 0.04, BORDER_DEFAULT); //检测角点
normalize(dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat()); //将结果归一化到0-255之间
for (int j = 0; j < dst_norm.rows; j++)
{
for (int i = 0; i < dst_norm.cols; i++)
{
if ((int)dst_norm.at<float>(j, i) > 150)
{
circle(src_gray, Point(i, j), 5, Scalar(0), 2, 8, 0); //角点画一个圆
}
}
}
imshow("cornerHarrisTest", src_gray);
}