Изучите и протестируйте набор визуальных слов с использованием дескрипторов VGG в OpenCV

У меня был код, который получает ORB ключевые точки и дескрипторы изображений, а затем он тренирует пакет слов, используя «BOWKMeansTrainermsgstr «Цель этого кода — кластеризовать фотографии с помощью k-средних. У меня нет проблем с использованием ORB.

Вот моя проблема:

Я видел, что openCV предоставляет VGG, вы можете найти его ВОТ. Я хочу использовать дескриптор VGG вместо ORB. Основываясь на документах, VGG не имеет никакой функции для создания ключевых точек, поэтому я использовал ORB keypoint, а затем использовал ORB keypoints для создания дескрипторов 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

Я ценю, если кто-то поможет мне найти решение для этого.

Спасибо,

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]