在OpenCV中使用VGG描述符训练和测试视觉单词

时间:2017-09-07 16:56:52

标签: c++ opencv image-processing opencv3.2

我有一个代码,它获取了ORB关键点和图像描述符,然后使用“BOWKMeansTrainer”训练了一包单词。此代码的目的是使用k-means聚类照片。使用ORB时没有任何问题。

这是我的问题:

我看到openCV提供了一个VGG,你可以找到它HERE。我想使用VGG描述符而不是ORB。基于这些文档,VGG没有任何关键点的功能,因此我使用了ORB关键点,然后使用ORB关键点来创建VGG描述符。

Ptr<ORB> detector = ORB::create();
Ptr<cv::xfeatures2d::VGG> detectorVGG = cv::xfeatures2d::VGG::create(VGG::VGG_120, 1.4f, true, true, 0.75f, true);

detector->detect(grayFrame, kp);
detectorVGG->compute(grayFrame, kp, descriptors);

这个也可以工作,我可以很容易地训练一下单词并将它们聚类成类似于我使用ORB的方式。但是当我想测试一下这个词时,我收到了这个错误:

error: (-215) _queryDescriptors.type() == trainDescType in function knnMatchImpl   Aborttrap: 6

我试图改变查询描述符Mat和描述符Mat的类型,但我无法解决它。在最好的情况下,错误更改为:

(-215) (type == CV_8U && dtype == CV_32S) || dtype == CV_32F in function batchDistance

我不确定问题是否是类型中的小错误,或者是因为同时使用ORB关键点和VGG描述符。

我的部分代码在这里:

vector<Mat> makeDescriptor(vector<Mat> frames)
    {
        int frameSize = frames.size();
        vector<Mat> characteristics;
        for (int i = 0 ; i < frameSize ; i++)
        {
            vector<KeyPoint> kp;
            Mat descriptors;
            Ptr<cv::xfeatures2d::VGG> detectorVGG = cv::xfeatures2d::VGG::create();
            Ptr<ORB> detectorORB = ORB::create();
            Mat frame = frames[i];
            if (frame.empty()) {
                cout << "Frame empty"<< "\n";
                continue;
            }
            Mat grayFrame;
            try
            {
                cvtColor(frame,grayFrame,CV_RGB2GRAY);
            }
            catch(Exception& e) 
            {
                continue;
            }

            detectorORB->detect(grayFrame,kp);
            detectorVGG->compute(grayFrame,kp,descriptors);
            characteristics.push_back(descriptors);
            }
            return characteristics;
        }

Mat makeDict(vector<Mat> characteristics, int _nCluster)
            {
                BOWKMeansTrainer bow(_nCluster);
                for (int j = 0 ; j < characteristics.size() ; j++)
                {
                    Mat descr = characteristics[j];
                    if (!descr.empty())
                    {
                        bow.add(descr);
                    }
                }
                Mat voc = bow.cluster();    
                return voc;
            }
BOWImgDescriptorExtractor makeBow(Mat dict) 
{

    Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");
    Ptr<DescriptorExtractor> extractor = VGG::create();
    BOWImgDescriptorExtractor bowDE(extractor,matcher);
    Mat voc;
    dict.convertTo(voc,CV_32F);
    bowDE.setVocabulary(voc);
    return bowDE;
}

void testBow(BOWImgDescriptorExtractor bowDE, vector<Mat> frames)
{
    Mat features;
    vector< vector<KeyPoint> > keypoints = makeORBKeyPoints(frames);
    for (int i = 0 ; i < frames.size() ; i++) 
    {
        Mat bowDesc;

        if (!keypoints[i].empty())
        {
            cout << "inside if" << '\n';
            Mat frame;
            frames[i].convertTo(frame, CV_8U);
            bowDE.compute(frame, keypoints[i], bowDesc); //This Line
            bowDesc.convertTo(bowDesc,CV_32F);
        }
        features.push_back(bowDesc);
    }
}

运行时错误发生在这一行:

bowDE.compute(frame, keypoints[i], bowDesc); //This Line

如果有人帮助我找到解决方案,我感激不尽。

谢谢,

0 个答案:

没有答案