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