首页 > 学院 > 开发设计 > 正文

Opencv之角检测cornerHarris函数的应用

2019-11-11 05:18:39
字体:
来源:转载
供稿:网友
//----------------------------------【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);}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表