#include<iostream>
#include<vector>
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
Mat dstImage;
Mat srcImage;
int g_nThred = 15;
void on_Track(int, void*)
{
//阀值后显示
//因为现在得到的角点图中的点的灰度值很小,为了方便计算,将这些灰度值规整(归一化操作)
Mat normalImage;
normalize(dstImage, normalImage, 0, 255, 32);
Mat thredImage;
threshold(normalImage, thredImage, g_nThred, 255, CV_THRESH_BINARY);
imshow("【阀值后显示】", thredImage);
//设置一个中间变量用来存储图像
Mat midImage;
dstImage.copyTo(midImage);
//另外一种显示方式
//遍历角点图中的点的灰度值,如果大于某个值,就显示出来
Mat showImage;
srcImage.copyTo(showImage);
for (int i = 0; i < showImage.rows; i++)
{
for (int j = 0; j < showImage.cols; j++)
{
if (normalImage.at<float>(i, j) > g_nThred)
{
circle(showImage, Point(j, i), 3, Scalar(255, 255, 0), 1, 8);
circle(midImage, Point(j, i), 3, Scalar(255, 255, 0), 1, 8);
}
}
}
imshow("【另外一种显示方式】", showImage);
imshow("【在角点图中显示圈】", midImage);
}
int main()
{
srcImage = imread("building.jpg");
namedWindow("【原图】");
imshow("【原图】", srcImage);
//因为角点检测的输入图像是单通道的,所以需要一个灰度图
Mat grayImage;
cvtColor(srcImage, grayImage, CV_BGR2GRAY);
//进行Harris角点检测
cornerHarris(grayImage, dstImage, 2, 3, 0.01);
//函数调用后,得到的是 一组被检测到的角点的灰度值的集合(dstImage是角点灰度值的矩阵)
//而且灰度值很小,所以如果直接显示,肉眼将无法分辨
//直接显示
imshow("【直接显示】", dstImage);
createTrackbar("thredValue", "【原图】", &g_nThred, 100, on_Track);
on_Track(0, 0);
waitKey(0);
return 0;
}
opencv3 实现Harris角点检测:cornerHarris函数-滚动条
最新推荐文章于 2023-08-21 14:01:49 发布