[英]ORB is not detecting keyPoints in opencv 2.4.9
我試圖用ORB檢測關鍵點一切正常,直到我切換到Opencv 2.4.9。
第一,似乎鍵的數量減少了,對於某些圖像,沒有檢測到關鍵點:
這是我用兩個版本編譯的代碼:(2.3.1和2.4.9)
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/features2d/features2d.hpp>
using namespace cv;
int main(int argc, char **argv){
Mat img = imread(argv[1]);
std::vector<KeyPoint> kp;
OrbFeatureDetector detector;
detector.detect(img, kp);
std::cout << "Found " << kp.size() << " Keypoints " << std::endl;
Mat out;
drawKeypoints(img, kp, out, Scalar::all(255));
imshow("Kpts", out);
waitKey(0);
return 0;
}
結果:2.3.1:找到152個關鍵點
2.4.9:找到0個關鍵點
我還測試了一個不同的ORB構造函數,但我得到了相同的結果,沒有KPts。 與2.3.1默認的構造函數中相同的構造函數值:2.4.9 custom constr:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/features2d/features2d.hpp>
using namespace cv;
int main(int argc, char **argv){
Mat img = imread(argv[1]);
std::vector<KeyPoint> kp;
// default in 2.4.9 is : ORB(700, 1.2f, 3, 31, 0);
OrbFeatureDetector detector(500, 1.2f, 8, 31, 0); // default values of 2.3.1
detector.detect(img, kp);
std::cout << "Found " << kp.size() << " Keypoints " << std::endl;
Mat out;
drawKeypoints(img, kp, out, Scalar::all(255));
imshow("Kpts", out);
waitKey(0);
return 0;
}
你知道發生了什么嗎? 我該如何解決?
謝謝。
在版本2.3.1和2.4.9之間,OpenCV中ORB的實現發生了很大變化。 很難確定一個可以解釋你觀察到的行為的變化。
但是,通過更改邊緣閾值的值,可以再次增加檢測到的要素數。
下面是你的代碼的改編版本,以顯示我的意思(小心,我只能用OpenCV 3.0.0測試它,但我想你明白了)。
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/features2d.hpp>
using namespace cv;
int main(int argc, char **argv){
Mat img = imread(argv[1]);
std::vector<KeyPoint> kp;
// Default parameters of ORB
int nfeatures=500;
float scaleFactor=1.2f;
int nlevels=8;
int edgeThreshold=15; // Changed default (31);
int firstLevel=0;
int WTA_K=2;
int scoreType=ORB::HARRIS_SCORE;
int patchSize=31;
int fastThreshold=20;
Ptr<ORB> detector = ORB::create(
nfeatures,
scaleFactor,
nlevels,
edgeThreshold,
firstLevel,
WTA_K,
scoreType,
patchSize,
fastThreshold );
detector->detect(img, kp);
std::cout << "Found " << kp.size() << " Keypoints " << std::endl;
Mat out;
drawKeypoints(img, kp, out, Scalar::all(255));
imshow("Kpts", out);
waitKey(0);
return 0;
}
至少在OpenCV 3.1中, edgeThreshold
參數實際上是“未檢測到要素的邊框的大小”。 檢測其他功能的一種方法是減少fastThreshold
參數。 這是一個誤導性的名稱,因為即使使用ORB::HARRIS_SCORE
(即Harris關鍵點),此閾值也會影響檢測到的角ORB::HARRIS_SCORE
,而不僅僅是基於參數名稱的FAST關鍵點。 這也有點誤導,因為edgeThreshold
本身聽起來像Harris角點檢測的閾值,而不是用於檢測點的圖像部分。
請參閱: http : //docs.opencv.org/trunk/db/d95/classcv_1_1ORB.html#gsc.tab=0 。
此外,增加金字塔等級nlevels
的數量可以為您提供更多關鍵點,但如果您的圖像大小相同且唯一的區別是您的OpenCV版本,則此處不太可能有所幫助。
我遇到了同樣的問題,這里是有效的代碼:
std::vector<KeyPoint> kpts1; Mat desc1; Ptr<ORB> orb = ORB::create(100, 2, 8, 31, 0, 2, ORB::HARRIS_SCORE, 31, 20); orb->detectAndCompute(input_image, Mat(), kpts1, desc1);
最后一個參數(上面的20)是要減少以獲取新關鍵點的fastThreshold
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.