一、概述
案例:使用cornerHarris實現角點檢測,並調節其參數看看不同參數下的不同效果
技術:Qt+C+++OpenCV
角點檢測函數介紹:
cornerHarris(src,dst,blockSize,ksize,k,BORDER_DEFAULT)
1.src:必須是單通道8位或者32位浮點圖像
2.dst:存儲角點結果圖像,它的格式是CV_32FC1,圖像大小和原圖大小一致
3.blockSize:掃描窗口的大小,ps:此值越大檢測到的結果越多
4.ksize:Sobel算子的大小,四鄰域、八鄰域等,此值越大檢測結果越多
5.k:此值是個經驗值一般只用0.04,其取值區間是0.04~0.06之間
實現角點檢測的步驟:
1.載入圖像
2.將圖像轉為灰度圖,因為cornerHarris的輸入只能是8位或者32位的灰度圖像
3.執行角點檢測,並將檢測到的結果輸出到dst中
4.將檢測到的值歸一化到0~255之間,因為輸出圖像dst檢測到的值是浮點數
5.將歸一化后的圖像像素值取絕對值,因為歸一化后的圖像有可能是負數
6.標定閥值,並循環輸出圖像,如果像素大於閥值就說明是角點(繪制出來),小於就直接舍棄
實驗結果(同等條件下):
1.blockSize越大檢測到的角點就越多
2.k的值越大檢測到的角點越多
3.ksize的值越大檢測到的角點越多
4.thresh閥值越大可用角點越少,越大可用角點也就越多
其中前三個值大道一定程度的時候全屏幕都是角點,非常不准確,需要根據實際的圖像情況實時的調節自己的參數。
二、代碼示例
src = imread(filePath); if(src.empty()){ cout << "圖片不能為空"<<endl; return; } // imshow("src",src); cvtColor(src,gray,COLOR_BGR2GRAY); // imshow("gray",gray); Mat dst,norm_dst, normScaleDst; cornerHarris(gray,dst,blockSize,ksize,k,BORDER_DEFAULT);//dst輸出參數一般32位浮點 //將dst數據歸一化到0~255之間 normalize(dst,norm_dst,0,255,NORM_MINMAX, CV_32FC1, Mat()); // imshow("normalize",norm_dst); //取絕對值 convertScaleAbs(norm_dst,normScaleDst); resultImg = src.clone(); for (int row = 0; row < resultImg.rows; row++) { uchar * currentRow = normScaleDst.ptr(row); for (int col = 0; col < resultImg.cols; col++) { int value = (int)*currentRow; if(value>thresh){ circle(resultImg,Point(col,row),2,Scalar(0,0,255),2,LINE_8,0); } currentRow++;//用指針速度快 } }
三、示例圖片(圖片上的紅色小圓就是繪制出來的角點)