Harris角点检测
cornerHarris函数主要用于检测图像的哈里斯(Harris)角点检测,判断出某一点是不是图像的角点
API:
void cornerHarris(InputArray src, //输入图像 输入单通道8位或浮点图像。
OutputArray dst, //输出图像 类型为CV_32FC1,大小与src相同。
int blockSize, //领域大小 ,计算λ1λ2时的矩阵大小
int ksize, //Sobel 求导中使用的窗口大小
double k, //Harris 角点检测方程中的自由参数,取值参数为[0,04,0.06] .
int borderType=BORDER_DEFAULT)
代码演示:
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int thresh = 130;
int max_count = 255;
const char* output_title = "HarrisCornerDetector Result";
Mat src, gray_src;
void Harris_Demo(int, void*);
int main(int argc, char** argv)
{
src = imread("E:/技能学习/opencv特征提取与检测/lena.jpg");
if (src.empty())
{
cout << "could not load image!" << endl;
return -1;
}
namedWindow("input image", WINDOW_AUTOSIZE);
imshow("input image", src);
namedWindow(output_title, WINDOW_AUTOSIZE);
cvtColor(src, gray_src, COLOR_BGR2GRAY);
//imshow(output_title, gray_src);
createTrackbar("Threshold:", output_title, &thresh, max_count, Harris_Demo);
Harris_Demo(0, 0);
waitKey(0);
return 0;
}
void Harris_Demo(int, void*)
{
Mat dst, norm_dst, normScaleDst;
dst = Mat::zeros(gray_src.size(), CV_32FC1);
int blockSize = 2; // 邻域半径
double k = 0.04;
int ksize = 3; // 邻域大小
//角点检测
cornerHarris(gray_src, dst, blockSize, ksize, k, BORDER_DEFAULT);
//归一化便于进行数值比较和结果显示
normalize(dst, norm_dst, 0, 255, NORM_MINMAX, CV_32FC1, Mat());
//将图像的数据类型变成CV_8U
/*convertScaleAbs函数是一个位深转化函数,可将任意类型的数据转化为CV_8UC1。具体数据处理方式如下:
(1).对于src*alpha + beta的结果如果是负值且大于 - 255,则直接取绝对值;
(2).对于src*alpha + beta的结果如果大于255,则取255;
(3).对于src*alpha + beta的结果是负值,且小于 - 255,则取255;
(4).对于src*alpha + beta的结果如果在0 - 255之间,则保持不变;*/
convertScaleAbs(norm_dst, normScaleDst);
//寻找Harris角点
Mat resultImg = src.clone();
for (int row = 0; row < resultImg.rows; row++)
{
uchar* currentRow = normScaleDst.ptr<uchar>(row);
for (int col = 0; col < resultImg.cols; col++)
{
int value = (int)*currentRow;
if (value > thresh)
{
circle(resultImg, Point(col, row), 2, Scalar(0, 0, 255), 2, 8, 0);
}
currentRow++;
}
}
imshow(output_title, resultImg);
}
本文详细介绍了Harris角点检测算法的工作原理,并结合OpenCV库提供了C++代码示例。通过cornerHarris函数实现图像角点定位,适合图像处理初学者和进阶者。
1164

被折叠的 条评论
为什么被折叠?



