2013年5月8日 星期三

EmguCV Image Process: Detecting and Matching Interest Points part2

20101219030.jpg
EmguCV Image Process: Detecting and Matching Interest Points

參考OpenCV 2 Computer Vision Application Programming Cookbook第八章

介紹內容如下:

Detecting Harris corners

Detecting FAST features

Detecting the scale-invariant SURF features

Describing SURF features

上一篇介紹了Harris corners detection

這篇來補充一個方法

其改善了原先Harris corner algorithm

使得偵測出的角點能夠更平均的分佈在影像上

由於Harris corners detection的方法在使用上存在一些問題

像是避免使用任意的參數K

如何改善角點的聚集,使其能夠平均的分布

像是能夠設定擷取角點的最大數量

以及設定角點與角點之間的最小距離

透過Harris corner detection的參數調整

盡可能取得影像中的所有角點

再去依照使用者設定的角點最大數量、最小距離等條件

去過濾所要的角點資訊

便可達到這樣的目標需求

而這在EmguCV中有直接實作在Image這個類別上

使用起來非常的簡單

Image<Gray, Byte> image = new Image<Gray, byte>("image.jpg");
PointF[][] points = image.GoodFeaturesToTrack(
    500,  //maximum number of corners to be returned
    0.01, //quality level
    10,   //minimum allowed distance between points 
    3     //size of the averaging block
    );
//for all corner
foreach (PointF point in points[0])
{
    //draw a circle at each corner location
    CircleF circle = new CircleF(point, 3);
    image.Draw(circle, new Gray(255), 1);
}
直接呼叫方法GoodFeaturesToTrack

回傳一個PointF的二維陣列

由於這裡採用的是灰階影像(Gray)

所以回傳的PointF二維陣列

其實只是一個一維陣列PointF[0]

那若是帶入彩色影像(Bgr)

則回傳的二維陣列,就會包含三個一維陣列(PointF[0]、PointF[1]、PointF[2])

其中帶入的參數分別是:

偵測角點的最大數量

二值化的quality level

角點間的最小距離

計算eigenvalue的最小區塊大小

處理的結果如下:
可以發現角點分布的很平均

也不會有許多角點擠在一起的狀況

效果看起來相當不錯!!

這個方法提升了複雜度

因為其將Harris corners detection的角點以Harris score做排序

又處理了角點分布的問題

但這個方法

比原先的Harris corners detection更加好用、實用

這也就是為什麼EmguCV未直接實作Harris corners detection的原因吧!


下一篇來介紹相當實用的Fast detection

2 則留言:

  1. 您的文章对我帮助很大,我是这方面的初学者,非常感谢……

    回覆刪除
    回覆
    1. 謝謝您的鼓勵,歡迎多來逛逛!

      刪除