0

我尝试使用 OpenCV 制作描述符字典。当我使用 BOWKmeansTrainer 的方法 .cluster() 时,我的应用程序抛出未处理的异常

OpenCV 错误:未知函数中的断言失败(data.dims <= 2 && type == CV_32F && K > 0),文件......\src\opencv\modules\core\src\matrix.cpp,行2485 未知异常

我不明白为什么会这样。我试图更改参数,但没有帮助。

你能给我一些想法如何解决这个问题吗?

int main(int argc, char* 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;

}

4

1 回答 1

0

您是否检查过您输入 BOWKMeansTrainer 的关键点和描述符是否有效?我认为这可能是一个很好的起点。

我能够使用 SIFT 将描述符输入 BOWKMeansTrainer,但不确定是否将其与 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 的 Mats。尝试将描述符保存在文件中并检查它们是否具有您期望的尺寸。

如果不是这个,那么它可能是您用于培训师的参数。

祝你好运。BOWKMeans 真的很难设置。

于 2014-02-13T20:05:08.160 回答