为什么我在尝试计算集群时派生未处理的异常

时间:2013-03-29 19:13:11

标签: opencv machine-learning computer-vision cluster-computing

我尝试使用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;

}

1 个答案:

答案 0 :(得分: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的垫。尝试将描述符保存在文件中,并检查它们是否具有您期望的尺寸。

如果不是这样,那么它可能是您为训练师使用的参数。

祝你好运。 BOWKMeans真的很难建立。