SIFT在OpenCV中的調用和具體實現(HELU版)
阿新 • • 發佈:2017-10-05
高斯 pan vector 圖片轉換 esc 循環 step () 簡單的
可以看出目前的結構是基於hess的算法進行的重構。那麽首先需要解決的是整體的調用和實現結構問題,然後是hess算法的結構問題,再然後才是具體的算法。需要做的事情很多,一起來研究。
一、OpenCV中sift調用接口和例子
首先是一定要編譯使用contrib版本的OpenCV代碼,同時最後設置的時候需要註意,頭文件和命名空間要選擇正確。
在最新版本的OpenCV中,已經對特征提取這塊的函數進行了統一接口:
Mat matSrc = imread("e:/template/lena.jpg");
Mat gray;
Mat draw;
cvtColor( matSrc, gray, CV_RGB2GRAY );
Mat descriptors;
std::vector<KeyPoint> keypoints;
// 生產sift結構
Ptr<SiftFeatureDetector> siftFD = SiftFeatureDetector::create();
siftFD->detectAndCompute(gray,Mat(),keypoints,draw);
drawKeypoints(gray,keypoints,gray,Scalar(0 ,0,255),DrawMatchesFlags::DEFAULT);
結果:
這裏也只是簡單地把特征點給畫了出來,並沒有將方向等信息進行表示。下面我們具體看一看sift在OpenCV中是如何實現的。
OpenCV是開發源代碼的,所以這裏的代碼都是可以自己看到的。那麽聯調的方式為
二、sift的代碼結構解析
註意,sift的原始地址在
它的類結構為:
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071203974-996157668.png)
它的構建函數為:
直接返回的是本類的指針
我們去看代碼,基本了解結構以後,就直接從我們想要用的那個函數開始“順藤摸瓜”。我們想要的是detectAndCompute 函數。
三、sift的代碼具體實現
step0: createInitialImage 將圖片轉換成為合適的大小
Mat base = createInitialImage(image, firstOctave < 0, (float)sigma);
最為簡單的一步,據說將輸入的圖片變化為規整的大小和格式:
//step1: buildGaussianPyramid 構建高斯金字塔
buildGaussianPyramid(base, gpyr, nOctaves);
//step2: buildDoGPyramid 構建高斯差分金字塔
buildDoGPyramid(gpyr, dogpyr);
//step3: findScaleSpaceExtrema removeDuplicated 尋找並篩選尺度空間特征值
findScaleSpaceExtrema(gpyr, dogpyr, keypoints);
註意這裏將特征值的初略尋找和細化尋找放在了一起(一個循環)
其中
其中二
註意:
//step4: calcDescriptors 計算特征值
calcDescriptors(gpyr, keypoints, descriptors, nOctaveLayers, firstOctave);
三、簡單小結
這裏也只是將sift的代碼挑了出來,簡單進行了分析。應該說OpenCV的代碼本身才是其最為精髓的地方,無論是代碼背後的理論,還是代碼實現的技術,以及各種提升速度的方法,都對於我們寫出出色的圖像處理算法和運用很有幫助。
而學習的最好方法就是去實現創造。OpenCV本身就是開源的項目,基於現有的這麽多的資源,在圖像處理廣闊的領域去進行創新,不斷鞏固提升自己的能力。與大家共勉!
前面我們對sift算法的流程進行簡要研究,那麽在OpenCV中,sift是如何被調用的?又是如何被實現出來的了?
特別是到了3.0以後,OpenCV對特征點提取這個方面進行了系統重構,那麽整個代碼結構變成了什麽模樣? 在代碼中![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071200833-744634460.png)
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071201443-965289106.png)
Mat draw;
cvtColor( matSrc, gray, CV_RGB2GRAY );
Mat descriptors;
std::vector<KeyPoint> keypoints;
// 生產sift結構
Ptr<SiftFeatureDetector> siftFD = SiftFeatureDetector::create();
siftFD->detectAndCompute(gray,Mat(),keypoints,draw);
drawKeypoints(gray,keypoints,gray,Scalar(0
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071201771-277696542.jpg)
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071202068-770136789.png)
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071202193-1718657751.png)
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071203068-2070278268.png)
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071203865-247321557.png)
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071203974-996157668.png)
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071204052-1390750043.png)
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071204146-1017332451.png)
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071204240-1614925081.png)
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071205818-1568483363.png)
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071206724-2108435637.png)
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071208021-849423805.png)
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071209052-1905587705.png)
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071211615-1203902553.png)
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071214193-1897105861.png)
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071215615-220398764.png)
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071216224-2140423725.png)
![技術分享](http://images2017.cnblogs.com/blog/508489/201710/508489-20171005071218380-1605065926.png)
SIFT在OpenCV中的調用和具體實現(HELU版)