0

Я пытаюсь сделать словарь дескрипторов с помощью OpenCV. Когда я использую метод .Cluster() из BOWKmeansTrainer, мое приложение выдает необработанное исключениеПочему я получаю необработанное исключение при попытке вычислить кластеры

OpenCV Error: Assertion failed (data.dims <= 2 && type == CV_32F && K > 0) in un known function, file ......\src\opencv\modules\core\src\matrix.cpp, line 2485 Unknown exception

Я не могу понять, почему это происходит. Я попытался изменить параметры, но это не помогло.

Не могли бы вы дать мне несколько идей, как я могу решить эту проблему?

INT основной (интермедиат ARGC, символ * ARGV []) {

const int countClusters = 2; 

vector<string> fileList; 

GetFilesInFolder(folder_one, fileList); 

vector<bool> trainMask(fileList.size()); 
InitRandomBoolVector(trainMask, 0.1); 

Ptr<FeatureDetector> keypointsDetector = FeatureDetector::create("HARRIS"); 

Ptr<DescriptorExtractor> descriptorsExtractor = DescriptorExtractor::create("BRIEF"); 

Mat descriptors; 
Mat voc; 

TermCriteria tc(TermCriteria::COUNT + TermCriteria::EPS, 10, 0.001); 
BOWKMeansTrainer bowTrainer(vocSize,tc); 
for(int i = 0;i < filesList.size();i++) 
{ 
    if(is_voc.at(i)) 
    { 
     vector<KeyPoint> keypoints; 
     Mat image = imread(filesList.at(i)); 

     keypointsDetector->detect(image,keypoints); 
     descriptorsExtractor->compute(image,keypoints,descriptors); 
     bowTrainer.add(descriptors); 
    } 
} 
try 
{ 
    voc = bowTrainer.cluster(); 
} 
catch(std::exception ex) 
{ 
    printf(ex.what()); 
} 


return 0; 

}

+0

Сообщение об исключении сообщает вам, в чем проблема. Прочтите это медленно и осторожно. – karlphillip

+0

Я ему помогаю: 'размеры <= 2' AND' type == CV_32F' AND 'K> 0'. Поэтому либо выберите другой тип, либо получите больше измерений. –

+1

У меня такое же исключение, которое довольно сложно понять. В частности, я не понимаю, какие размеры <= 2. Есть ли кто-нибудь, предлагающий внимательно прочитать исключение, кто также может объяснить, что такое эти измерения? –

ответ

0

Вы проверили, что ключевые точки и дескрипторы, которые вы подаете в BOWKMeansTrainer действительны? Я думаю, что это может быть хорошим местом для начала.

Я смог передать дескрипторы в BOWKMeansTrainer, используя SIFT, но не уверен в использовании этого с HARRIS/BRIEF. Вот код для метода SIFT:

Mat allDescriptors; 
    SiftDescriptorExtractor detector; 
    for (int i = 1; i <= 10; i++) { 
     // get keypoints 
     vector<KeyPoint> keypoints; 
     // assuming you have a function intToString that converts your iterator to a string, 
     // this line creates a file path, e.g. /home/ubuntu/1.jpg to /home.ubuntu/10.jpg 
     string imagePath = "<put path to your image here>" + "/" + intToString(i) + ".jpg"; 
     Mat imageToUse = imread(imagePath, CV_LOAD_IMAGE_GRAYSCALE); //Load as grayscale 
     detector.detect(imageToUse, keypoints); 
     // get descriptors 
     Mat descriptors; 
     detector.compute(imageToUse, keypoints,descriptors); 
     // load descriptors into your descriptor array 
     allDescriptors.push_back(descriptors); 
    } 

Этот код использует SiftDescriptorExtractor как для ключа обнаружения точки и извлечения дескриптора. Если вы сохраните ключевые точки и дескрипторы в файле, вы увидите, что они являются матами размером 128 * n. Попробуйте сохранить дескрипторы в файле и убедитесь, что у них есть размеры, которые вы ожидаете.

Если это не так, то это могут быть панели, которые вы используете для тренера.

Удачи. BOWKMeans действительно сложно настроить.

+0

По совпадению я получил такую ​​же ошибку, потому что мой дескриптор был пуст. – Darren

Смежные вопросы