ORB не обнаруживает ключевые точки в 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. Пользовательская конструкция:

#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;
}

Ты хоть представляешь, что происходит? И как я могу это исправить?

Спасибо.

8

Решение

Реализация ORB в OpenCV значительно изменилась между версиями 2.3.1 и 2.4.9. Трудно определить одно изменение, которое может объяснить поведение, которое вы наблюдали.

Однако, изменив значение порогового значения, вы можете снова увеличить количество обнаруженных объектов.

Ниже приведена адаптированная версия вашего кода, чтобы показать, что я имею в виду (осторожно, я мог протестировать его только с 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;
}
9

Другие решения

В OpenCV 3.1, по крайней мере, edgeThreshold Параметр на самом деле «размер границы, где объекты не обнаружены». Одним из способов обнаружения дополнительных функций является уменьшение fastThreshold параметр. Это вводящее в заблуждение название, поскольку этот порог влияет на количество углов, обнаруженных даже при использовании ORB::HARRIS_SCOREэто ключевые точки Harris, а не только FAST, как вы могли бы подумать, основываясь на имени аргумента. Это также немного вводит в заблуждение, потому что edgeThreshold само по себе звучит как порог при обнаружении угла Харриса, а не на той части изображения, которая используется для обнаружения точек.

Увидеть: 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 уменьшить, чтобы получить новые ключевые точки.

1

По вопросам рекламы [email protected]