//----------------------------------【cornerHaris函数使用】--------------------------------
// 描述:cornerHaris函数使用
// 2017.2.6 by橘子味
//-----------------------------------------------------------------------------------------
#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
using namespace cv;
int g_thresh;
Mat g_srcImg;
void on_CornerHarris(int,void*);
int main() {
Mat srcImg, dstImg;
srcImg = imread("img.jpg");
if (srcImg.empty()) { printf("%s", "没有找到图片"); return 0; }
else { g_srcImg = srcImg; }
namedWindow("原图");
namedWindow("Harris检测过后的图像");
imshow("原图", srcImg);
on_CornerHarris(0, 0);
//设置一个最大值为255的滑动条
createTrackbar("阈值", "Harris检测过后的图像", &g_thresh, 255,on_CornerHarris);
waitKey(0);
return 0;
}
void on_CornerHarris(int,void*) {
Mat srcImg, dstImg,grayImg;
Mat normImg, scaledImage;
int blockSize = 2; //领域大小 建议2
int kSize = 3;//孔径大小 建议3
double k = 0.06;//计算角度的响应参数 据说是经过大量实验得出在0.04到0.06之间比较好
srcImg = g_srcImg.clone();
dstImg = Mat::zeros(srcImg.size(), CV_32FC1);
//转化为灰度图,cornerHarris函数需要以灰度图来进行计算。
cvtColor(srcImg,grayImg, COLOR_BGR2GRAY);
//进行Harris角度检测,cornerHarris函数会给dstImg参数返回一个格式为CV_32FC1,图像大小和源图像一致的图像。
cornerHarris(grayImg, dstImg, blockSize, kSize, k);
//均一化计算 把原来的每个像素点的数据按比例缩小到0到255之间
normalize(dstImg, normImg, 0, 255, NORM_MINMAX, CV_32FC1,Mat());
//将数据变成8位无符号整形,目的是出去负数什么的吧。
convertScaleAbs(normImg, scaledImage);
for (int row = 0; row < dstImg.rows;++row ) {
for (int col = 0; col < dstImg.cols;++col) {
//如果这个通过Harris算法计算过的像素点大于滑动条设定的阈值就说明这是一个角点。
//按教程来说是这样取像素点的【(int)scaledImage.at<float>(row,col)】,但是我写的会报错,暂时不知道为啥,如果有大神知道麻烦告诉一声。
if (scaledImage.at<uchar>(row,col) > g_thresh ) {
circle(srcImg, Point(col, row), 5, Scalar(0, 0, 255), 2, 8, 0);
}
}
}
imshow("Harris检测过后的图像", srcImg);
}
Opencv之角检测cornerHarris函数的应用
最新推荐文章于 2024-06-11 14:30:28 发布