1. 程式人生 > >Opencv之角檢測cornerHarris函式的應用

Opencv之角檢測cornerHarris函式的應用

//----------------------------------【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); }