Opencv之角檢測cornerHarris函式的應用
阿新 • • 發佈:2019-02-17
//----------------------------------【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);
}