引言及特征點監(jiān)測器
前面提到的SURF與SIFT特征檢測器與描述子
,
其實都是OpenCV擴展模塊xfeature2d
中的內(nèi)容,
而在OpenCV本身包含的feature2d模塊中
也包含了幾個非常有用的特征檢測器與描述子
,
其所支持的特征點檢測器(FeatureDetector)
如下:
- FAST=1
- STAR=2
- ORB=5
- MSER=6
- GFTT=7
- HARRIS=8
- SIMPLEBLOB=9
- DENSE=10
- BRISK=11
- AKAZE=12
其中,3、4
本來是SIFT
與SURF
的艾杏,但在OpenCV3.x
中,它們已經(jīng)被移到擴展模塊
中了盅藻。
如果使用OpenCV官方編譯好的OpenCV4Android 3.x版本的SDK
购桑,
則當(dāng)聲明與使用這兩個類型的時候,它會告訴你不支持
氏淑。
描述子類型
feature2d
支持的特征點檢測器
還支持以下的描述子類型
:
- DescriptorExtractor.ORB=3
- DescriptorExtractor.BRIEF=4
- DescriptorExtractor.BRISK=5
- DescriptorExtractor.FREAK=6
- DescriptorExtractor.AKAZE=7
這里其實還有1與2
分別是SIFT與SURF
勃蜘,
但其已經(jīng)被移到擴展模塊
了,所以如果聲明使用會拋出不支持
的錯誤提示夸政。
簡單介紹幾種特征提取方法
在feature2d模塊
中同時具有特征點檢測與描述子功能的方法
有ORB元旬、BRISK榴徐、AKAZE
守问。
下面我們簡單介紹一下這三種特征提取方法
。
1.ORB檢測器與描述子
-
ORB(Oriented FAST and Rotated BRIEF)
是OpenCV實驗室于2011年開發(fā)出來的一種新的特征提取算法
坑资,
相比較于SIFT與SURF
耗帕,
ORB的一大好處是沒有專利限制
,
可以免費自由使用
袱贮,
同時具有旋轉(zhuǎn)不變性與尺度不變性
仿便。
OpenCV4Android中創(chuàng)建ORB檢測器與描述子的代碼:
FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
DescriptorExtractor descriptorExtractor = DescriptorExtractor.create(DescriptorExtractor.ORB);
2.BRISK檢測器與描述子
-
BRISK(Binary Robust Invariant Scalable Keypoint)特征檢測與描述子
是在2011年由幾位作者聯(lián)合提出的一種新的特征提取算法
,
OpenCV4Android中創(chuàng)建ORB檢測器與描述子的代碼如下:
FeatureDetector detector = FeatureDetector.create(FeatureDetector.BRISK);
DescriptorExtractor descriptorExtractor = DescriptorExtractor.create(DescriptorExtractor.BRISK);
3.AKAZE檢測器與描述子
AKAZE算法是
SIFT算法之后
,
具有尺度不變性
與旋轉(zhuǎn)不變性算法領(lǐng)域
的再一次突破
攒巍,
它是KAZE特征提取算法
的加速版本
嗽仪;其
算法原理有別于前面提到的幾種方法
,
其是通過正則化PM方程與AOS(加性算子分裂)方法
來求解非線性擴散
柒莉,
從而得到 尺度空間 的 每一層
闻坚;采樣的方法與
SIFT
類似,
對每一層實現(xiàn)候選點的定位與過濾
以實現(xiàn)關(guān)鍵點的提取
兢孝;然后再使用與
SURF
求解方向角度類似的方法實現(xiàn)旋轉(zhuǎn)不變性
特征窿凤,
最終生成AKAZE描述子
。
AKAZE算法的原理本身比較復(fù)雜跨蟹,筆者所讀的書中亦無詳細(xì)解說雳殊,
感興趣的小伙伴閱讀相關(guān)論文去深入了解。
在OpenCV4Android中創(chuàng)建AKAZE特征檢測器與描述子的代碼如下:
FeatureDetector detector = FeatureDetector.create(FeatureDetector.AKAZE);
DescriptorExtractor descriptorExtractor = DescriptorExtractor.create(DescriptorExtractor.AKAZE);
4. OpenCV4Android中feature2d檢測器與描述子的使用
基于feature2d中的檢測器對象實現(xiàn)對象關(guān)鍵點檢測的演示代碼:
FeatureDetector detector = null;
if(type == 1) {
detector = FeatureDetector.create(FeatureDetector.ORB);
} else if(type == 2) {
detector = FeatureDetector.create(FeatureDetector.BRISK);
} else if(type == 3) {
detector = FeatureDetector.create(FeatureDetector.FAST);
} else if(type == 4){
detector = FeatureDetector.create(FeatureDetector.AKAZE);
} else {detector = FeatureDetector.create(FeatureDetector.HARRIS);
}
MatOfKeyPoint keyPoints = new MatOfKeyPoint();
detector.detect(src, keyPoints);
Features2d.drawKeypoints(src, keyPoints, dst);
以AKAZE為例窗轩,在feature2d中實現(xiàn)圖像特征檢測夯秃、描述子計算、特征匹配的演示代碼如下:
private void descriptorDemo(Mat src, Mat dst) {
String boxFile = fileUri.getPath().replaceAll("box_in_scene", "box");
Mat boxImage = Imgcodecs.imread(boxFile);
FeatureDetector detector = FeatureDetector.create(FeatureDetector.AKAZE);
DescriptorExtractor descriptorExtractor = DescriptorExtractor.create
(DescriptorExtractor.AKAZE);
// 關(guān)鍵點檢測
MatOfKeyPoint keyPoints_box = new MatOfKeyPoint();
MatOfKeyPoint keyPoints_scene = new MatOfKeyPoint();
detector.detect(boxImage, keyPoints_box);
detector.detect(src, keyPoints_scene);
// 描述子生成
Mat descriptor_box = new Mat();
Mat descriptor_scene = new Mat();
descriptorExtractor.compute(boxImage, keyPoints_box, descriptor_box);
descriptorExtractor.compute(src, keyPoints_scene, descriptor_scene);
// 特征匹配
MatOfDMatch matches = new MatOfDMatch();
DescriptorMatcher descriptorMatcher = DescriptorMatcher.create
(DescriptorMatcher.BRUTEFORCE_HAMMING);
descriptorMatcher.match(descriptor_box, descriptor_scene, matches);
Features2d.drawMatches(boxImage, keyPoints_box, src, keyPoints_scene, matches, dst);
// 釋放內(nèi)存
keyPoints_box.release();
keyPoints_scene.release();
descriptor_box.release();
descriptor_scene.release();
matches.release();
}
如果是作者本人的GitHub項目的話,
運行時仓洼,首先需要把drawable中的box.png與box_in_scene圖像放到SD卡上的指定目錄下箫措,
在演示程序運行之后選擇box_in_scene圖像即可。
當(dāng)然我們也可以更改一下代碼衬潦,使用別的圖片進行測試或者把圖片放在項目中進行測試斤蔓。
參考材料
- 《OpenCV Android 開發(fā)實戰(zhàn)》(賈志剛 著)
- 關(guān)于《OpenCV Android 開發(fā)實戰(zhàn)》作者的GitHub項目
- 筆者基于作者GitHub維護的APP