我正在嘗試使用Android和OpenCV構建一個簡單的葉識別應用程序;我的數據庫只包含3個條目(3種葉子的3張圖片),我希望能夠識別數據庫中的某張圖片是否位於智能手機拍攝的另一張圖片的內部。 我使用SURF方法從數據庫圖像中提取關鍵點,然後將它們與捕獲的圖像的提取關鍵點進行比較以尋找匹配。 我的問題是,結果顯示爲「顏色匹配」,而不是「特徵匹配」:當我比較數據庫和捕獲的圖片時,匹配數與所有3個條目相等,因此我得到錯誤的匹配。在Android中使用SURF與OpenCV進行圖像識別
從數據庫中的圖片這一個(注意,是沒有研究背景)
這是我得到的結果是:在上面
圖片從智能手機捕獲的圖像和下面的圖像是突出顯示匹配的結果。
這裏是我的實現代碼:
Mat orig = Highgui.imread(photoPathwithoutFile);
Mat origBW = new Mat();
Imgproc.cvtColor(orig, origBW, Imgproc.COLOR_RGB2GRAY);
MatOfKeyPoint kpOrigin = createSURFdetector(origBW);
Mat descOrig = extractDescription(kpOrigin, origBW);
Leaf result = findMatches(descOrig);
Mat imageOut = orig.clone();
Features2d.drawMatches(orig, kpOrigin, maple, keypointsMaple, resultMaple, imageOut);
public MatOfKeyPoint createSURFdetector (Mat origBW) {
FeatureDetector surf = FeatureDetector.create(FeatureDetector.FAST);
MatOfKeyPoint keypointsOrig = new MatOfKeyPoint();
surf.detect(origBW, keypointsOrig);
return keypointsOrig;
}
public Mat extractDescription (MatOfKeyPoint kpOrig, Mat origBW) {
DescriptorExtractor surfExtractor = DescriptorExtractor.create(FeatureDetector.SURF);
Mat origDesc = new Mat();
surfExtractor.compute(origBW, kpOrig, origDesc);
return origDesc;
}
public Leaf findMatches (Mat descriptors) {
DescriptorMatcher m = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE);
MatOfDMatch max = new MatOfDMatch();
resultMaple = new MatOfDMatch();
resultChestnut = new MatOfDMatch();
resultSwedish = new MatOfDMatch();
Leaf match = null;
m.match(descriptors, mapleDescriptors, resultMaple);
Log.d("Origin", resultMaple.toList().size()+" matches with Maples");
if (resultMaple.toList().size() > max.toList().size()) { max = resultMaple; match = Leaf.MAPLE; }
m.match(descriptors, chestnutDescriptors, resultChestnut);
Log.d("Origin", resultChestnut.toList().size()+" matches with Chestnut");
if (resultChestnut.toList().size() > max.toList().size()) { max = resultChestnut; match = Leaf.CHESTNUT; }
m.match(descriptors, swedishDescriptors, resultSwedish);
Log.d("Origin", resultSwedish.toList().size()+" matches with Swedish");
if (resultSwedish.toList().size() > max.toList().size()) { max = resultSwedish; match = Leaf.SWEDISH; }
//return the match object with more matches
return match;
}
我怎樣才能不基於顏色,但對圖片的實際奇點更精確的匹配?
有趣!您能否附上一段代碼來做到這一點?因爲我沒有完全明白你的意思:我試圖在匹配後執行'findHomography',但我認爲我做錯了什麼。謝謝 –
編輯答案包含代碼片段。我用你的葉子圖像作爲輸入,縮放爲512像素的高度。 – alexisrozhkov