C++ OpenCV4弓和x2B;SIFT-步骤和语法

C++ OpenCV4弓和x2B;SIFT-步骤和语法,c++,image-recognition,sift,opencv4,C++,Image Recognition,Sift,Opencv4,我有一个问题,了解如何使用筛弓(袋(视觉)的话)。 假设我有一个包含100幅图像的训练数据集,50幅0类图像和50幅1类图像。我也有培训标签。还有一个混合测试集图像 步骤1)我创建了一个SIFT检测器,它在训练图像中检测关键点并计算关键点的描述符 步骤2)我使用BowKmeanFilter对描述符进行聚类并获取字典。BowKMeanFilter的构造函数将参数clusterCount设置为2,因为我的数据有两个类,我想要两个包?是否有可能通过标签将样本分开,因为我知道哪些图像应该属于哪个集群。

我有一个问题,了解如何使用筛弓(袋(视觉)的话)。 假设我有一个包含100幅图像的训练数据集,50幅0类图像和50幅1类图像。我也有培训标签。还有一个混合测试集图像

步骤1)我创建了一个SIFT检测器,它在训练图像中检测关键点并计算关键点的描述符

步骤2)我使用BowKmeanFilter对描述符进行聚类并获取字典。BowKMeanFilter的构造函数将参数
clusterCount
设置为2,因为我的数据有两个类,我想要两个包?是否有可能通过标签将样本分开,因为我知道哪些图像应该属于哪个集群。 当我对描述符进行聚类时,会得到一个2x128大小的矩阵

步骤3)我实例化一个BOWImgDescriptorExtractor对象来计算测试图像的描述符

步骤4)然后我用字典训练Knn,并用测试图像中的描述符对其进行测试

我最大的问题是:如何处理具有多个类的数据集?如何使用创建的字典和testDescriptor进行最终预测


    // step 1
    int dataSetSize = trainingImages.size();
    vector<KeyPoint> keypoints;
    Mat descriptor;
    Mat descriptorCollection;
    Ptr<SIFT> detector = SIFT::create();

    for(int i=0; i<dataSetSize; i++){
        detector->detect(trainingImages[i], keypoints);
        detector->compute(trainingImages[i], keypoints,descriptor);
        descriptorCollection.push_back(descriptor);
    }

    // step 2
    int dictionarySize=2;
    BOWKMeansTrainer bowkTrainer(dictionarySize);
    Mat dictionary=bowkTrainer.cluster(descriptorCollection);

    // step 3
    Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create(DescriptorMatcher::FLANNBASED);
    Ptr<FeatureDetector> detector = SIFT::create();
    Ptr<DescriptorExtractor> extractor = SIFT::create();

    BOWImgDescriptorExtractor bow(extractor,matcher);
    bow.setVocabulary(dictionary);

    vector<KeyPoint> keypoints;
    detector->detect(testImage,keypoints);
    Mat testDescriptor;
    bow.compute(testImage,keypoints,testDescriptor);

    // step 4
    Ptr<cv::ml::KNearest> knn  =  ml::KNearest::create();
    Mat trainingLabel(Size(1, 50), CV_32F, Scalar(0));
    Mat label2(Size(1, 50), CV_32F, Scalar(1));
    trainingLabel.push_back(label2);
    knn->train(dictionary, ml::ROW_SAMPLE, trainingLabel),

    Mat predMat;
    Mat predRes;
    Mat distance;

    knn->findNearest(testDescriptor, 5, predMat, predRes, distance);

//第一步
int dataSetSize=trainingImages.size();
矢量关键点;
Mat描述符;
Mat描述符集合;
Ptr检测器=SIFT::create();
对于(int i=0;idetect(训练图像[i],关键点);
检测器->计算(训练图像[i],关键点,描述符);
描述符集合。推回(描述符);
}
//步骤2
int dictionarySize=2;
BowkMean和bowkTrainer(字典化);
Mat dictionary=bowkTrainer.cluster(描述符集合);
//步骤3
Ptr matcher=DescriptorMatcher::create(DescriptorMatcher::flannbase);
Ptr检测器=SIFT::create();
Ptr提取器=SIFT::create();
BOWImgDescriptorExtractor bow(提取器、匹配器);
词汇量(词典);
矢量关键点;
检测器->检测(测试图像、关键点);
Mat测试描述符;
compute(testImage、keypoints、testDescriptor);
//步骤4
Ptr knn=ml::KNearest::create();
Mat培训标签(尺寸(1,50),CV_32F,标量(0));
Mat label2(尺寸(1,50),CV_32F,标量(1));
培训标签。推回(标签2);
knn->train(字典,ml::行样本,trainingLabel),
垫前垫;
垫子;
垫距;
knn->findNearest(testDescriptor,5,predMat,predRes,distance);