2015-04-25 2 views
1

Кто-нибудь знает ссылку на реализацию BRIEF с OpenCV 2.4? С уважением.Внедрение BRIEF с OpenCV 2.4.10

PS: Я знаю, что такие вопросы, как правило, не приветствуются на SO, поскольку основное внимание уделяется тому, что вы сделали. Но был аналогичный question, который был довольно хорошо принят.

Один из ответов на эти вопросы предлагает общий способ для SIFT, который может быть расширен до КРАТКИЙ. Вот мой слегка измененный код.

#include <opencv2/nonfree/nonfree.hpp> 
#include <opencv2/highgui/highgui.hpp> 

//using namespace std; 
using namespace cv; 

int main(int argc, char *argv[]) 
{   
    Mat image = imread("load02.jpg", CV_LOAD_IMAGE_GRAYSCALE); 
    cv::initModule_nonfree(); 
    // Create smart pointer for SIFT feature detector. 
    Ptr<FeatureDetector> featureDetector = FeatureDetector::create("HARRIS"); // "BRIEF was initially written. Changed after answer." 
    vector<KeyPoint> keypoints; 

    // Detect the keypoints 
    featureDetector->detect(image, keypoints); // NOTE: featureDetector is a pointer hence the '->'. 

    //Similarly, we create a smart pointer to the SIFT extractor. 
    Ptr<DescriptorExtractor> featureExtractor = DescriptorExtractor::create("BRIEF"); 

    // Compute the 128 dimension SIFT descriptor at each keypoint. 
    // Each row in "descriptors" correspond to the SIFT descriptor for each keypoint 
    Mat descriptors; 
    featureExtractor->compute(image, keypoints, descriptors); 

    // If you would like to draw the detected keypoint just to check 
    Mat outputImage; 
    Scalar keypointColor = Scalar(255, 0, 0);  // Blue keypoints. 
    drawKeypoints(image, keypoints, outputImage, keypointColor, DrawMatchesFlags::DEFAULT); 

    namedWindow("Output"); 
    imshow("Output", outputImage); 

    char c = ' '; 
    while ((c = waitKey(0)) != 'q'); // Keep window there until user presses 'q' to quit. 

    return 0; 

} 

Проблема с этим кодом является то, что он дает ошибку: First-chance exception at 0x00007FFB84698B9C in Project2.exe: Microsoft C++ exception: cv::Exception at memory location 0x00000071F4FBF8E0.

Результаты ошибок в преломлении выполнения функции. Тег говорит, что выполнение возобновится на линии namedWindow("Output");.

Возможно, кто-то поможет устранить эту проблему или предложить новый код в целом? Благодарю.

EDIT: На терминале теперь отображается ошибка: Assertion failed (!outImage.empty()) in cv::drawKeypoints, file ..\..\..\..opencv\modules\features2d\src\draw.cpp, line 115. Следующий оператор, из которого будет возобновлен код, останется таким же, как и drawKepoints.

+1

В какой строке вы узнали об ошибке? –

+0

@Golazo: Мой плохой. Я отредактировал вопрос. – therainmaker

ответ

6

В OpenCV, КРАТКОЕ является DescriptorExtractor, не FeatureDetector. Согласно FeatureDetector::create, этот заводской метод не поддерживает алгоритм "BRIEF". Другими словами, FeatureDetector::create("BRIEF") возвращает нулевой указатель, и ваша программа сработает.

общие этапы согласования признака являются:

  1. Найти некоторые интересные (функция) точек в изображении: FeatureDetector
  2. Найти способ, чтобы описать эти пункты: DescriptorExtractor
  3. Try, чтобы соответствовать дескрипторы (векторы признаков) в двух изображениях: DescriptorMatcher

КРАТКОЕ является аль gorithm только для шага 2. Вы можете использовать некоторые другие методы: HARRIS, ORB, ..., на этапе 1 и передать результат на шаг 2, используя КРАТКОЕ ОПИСАНИЕ. Кроме того, SIFT может использоваться на обоих этапах 1 и 2, потому что алгоритм предоставляет методы для обоих этапов.


Вот простой пример использования КРАТКОЕ в OpenCV. Первый шаг, найти точки, что выглядит интересно (ключевые моменты) в изображении:

vector<KeyPoint> DetectKeyPoints(const Mat &image) 
{ 
    auto featureDetector = FeatureDetector::create("HARRIS"); 
    vector<KeyPoint> keyPoints; 
    featureDetector->detect(image, keyPoints); 
    return keyPoints; 
} 

Вы можете попробовать любой FeatureDetector algorithm вместо "HARRIS". Следующий шаг, вычислить дескрипторы из ключевых моментов:

Mat ComputeDescriptors(const Mat &image, vector<KeyPoint> &keyPoints) 
{ 
    auto featureExtractor = DescriptorExtractor::create("BRIEF"); 
    Mat descriptors; 
    featureExtractor->compute(image, keyPoints, descriptors); 
    return descriptors; 
} 

Вы можете использовать algorithm другое, чем "BRIEF" тоже.И вы можете видеть, что алгоритмы в DescriptorExtractor - это не то же самое, что алгоритмы в FeatureDetector. Последний шаг, сопоставьте два дескриптора:

vector<DMatch> MatchTwoImage(const Mat &descriptor1, const Mat &descriptor2) 
{ 
    auto matcher = DescriptorMatcher::create("BruteForce"); 
    vector<DMatch> matches; 
    matcher->match(descriptor1, descriptor2, matches); 
    return matches; 
} 

Кроме того, вы можете попробовать различные matching algorithm кроме "BruteForce". Наконец вернуться к основной программе, вы можете создать приложение из этих функций:

auto img1 = cv::imread("image1.jpg"); 
auto img2 = cv::imread("image2.jpg"); 

auto keyPoints1 = DetectKeyPoints(img1); 
auto keyPoints2 = DetectKeyPoints(img2); 

auto descriptor1 = ComputeDescriptors(img1, keyPoints1); 
auto descriptor2 = ComputeDescriptors(img2, keyPoints2); 

auto matches = MatchTwoImage(descriptor1, descriptor2); 

и использовать matches вектор для завершения приложения. Если вы хотите проверить результаты, OpenCV также предоставляет functions, чтобы нарисовать результаты операции 1 & 3 на картинке. Например, нарисуйте матчи на последнем этапе:

Mat result; 
drawMatches(img1, keyPoints1, img2, keyPoints2, matches, result); 
imshow("result", result); 
waitKey(0); 
+0

Если бы я сейчас хотел проверить соответствие свойств, что мне делать? Есть ли способ количественного определения ложных срабатываний, точности совпадения ключевых точек и т. Д.? – therainmaker

+0

Когда я заменяю «BRIEF» на «SIFT» или любой другой экстрактор дескриптора функции, я получаю сообщение об ошибке в доступе к ячейке памяти в 'featureExtractor-> compute (image, keyPoints, descriptors);'. Что может быть причиной этого? – therainmaker

+0

Поскольку '' SIFT'' находится в несвободном модуле, в [документации] есть примечание (http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_feature_detectors.html#featuredetector-create): добавьте ' #include 'и вызывать' initModules_nonfree(); 'перед' DetectKeyPoints' – mcchu

Смежные вопросы