OpenCV實現角點檢測(cornerHarris)


一、概述

  案例:使用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++;//用指針速度快
        }
    }

 

三、示例圖片(圖片上的紅色小圓就是繪制出來的角點)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM