Ошибка с Breif, оживленный дескриптор opencv

Я сталкиваюсь с ошибкой при использовании дескриптора BREIF в open cv. Ошибка в том, что BREIF не может дать дескриптор для всех ключевых моментов. Это дает дескриптор для меньшего количества ключевых точек, чем ожидалось. Ошибка, которую я получаю, заключается в следующем. Ошибка только в использовании дескриптора breif. Нет ошибки при использовании дескриптора SURF и SURF

Ошибка OpenCV: сбой утверждения (маски [i].rows == queryDescriptorsCount && masks[i].cols == trainDescCollection[i].rows && маски [i].type() == CV_8UC1) в контрольных масках, файл /home/shashank/Desktop/opencv-2.4.5/modules/features2d/src/matchers.cpp, строка 259 завершается, после вызова экземпляра cv::Exception what(): /home/shashank/Desktop/opencv-2.4.5/modules/features2d/src/matchers.cpp:259: ошибка: (-215) masks[i].rows == queryDescriptorsCount && masks[i].cols == trainDescCollection[i].rows && masks[i].type() == CV_8UC1 в функции checkMasks

По дальнейшему запросу мы получаем
Нет ключевой точки на предыдущем изображении 957 Нет ключевой точки на следующем изображении 910 размер дескриптора breif 32X880. Это должно быть 32X957 размер дескриптора breif 32X847. Это должна быть маска 32х910 [910 х 957]

Код следующий

     cv::Ptr<FeatureDetector> detector=new GridAdaptedFeatureDetector(new SurfAdjuster(),keypt,noofbucketinwidth,noofbucketinlength);//surf


 //cv::Ptr<FeatureDetector> detector=new GridAdaptedFeatureDetector(new FastAdjuster(10,true),keypt,noofbucketinwidth,noofbucketinlength); //FAST

     detector->detect(img,keypointimage);
    cout<<"noof keypoint "<<keypointimage.size()<<endl;


    //for descriptor
    Mat descriptor;
     Ptr<DescriptorExtractor> extractdetector=DescriptorExtractor::create("SURF");
     Ptr<DescriptorExtractor> extractdetector=DescriptorExtractor::create("BRIEF");   
        extractdetector->compute( img, detectedpoint, descriptor);    

    //for matching
    if(FAST_H_prev.empty())
            FAST_H_prev = Mat::eye(3,3,CV_32FC1);

        std::vector<unsigned char> FAST_match_mask;

        if(!currentimagekeypoint.empty())
        {
            std::vector<cv::KeyPoint> test_kpts;
            warpKeypoints(FAST_H_prev.inv(), nextimagekeypoint, test_kpts);

           cv::Mat FAST_mask = windowedMatchingMask( test_kpts, currentimagekeypoint, 25, 25);
                matcher->match(Discriptorofnextimage,Discriptorofcurrentimage, FAST_matches, FAST_mask);
                      matches2points(currentimagekeypoint, nextimagekeypoint, FAST_matches, FAST_train_pts, FAST_query_pts);
            if(FAST_matches.size() > 5)
            {
                cv::Mat H = findHomography(FAST_train_pts, FAST_query_pts, RANSAC, 4, FAST_match_mask);
                if(countNonZero(Mat(FAST_match_mask)) > 15)
                    FAST_H_prev = H;
                else
                    FAST_H_prev = Mat::eye(3,3,CV_32FC1);
                               drawMatchesRelative(currentimagekeypoint, nextimagekeypoint, FAST_matches, currentimage, FAST_match_mask);

            }
        }
    else
    {
        FAST_H_prev = Mat::eye(3,3,CV_32FC1);
    }

1 ответ

В реализации OpenCV дескрипторы Breif удаляют ключевые точки слишком близко от границ.

//Remove keypoints very close to the border
KeyPointsFilter::runByImageBorder(keypoints, image.size(), PATCH_SIZE/2 + KERNEL_SIZE/2);

Решением может быть фильтрация ключевых точек в вашем коде, а затем извлечение дескрипторов.

Другие вопросы по тегам