将 SVM 与 SURF 结合使用时出错

Posted

技术标签:

【中文标题】将 SVM 与 SURF 结合使用时出错【英文标题】:Getting error using SVM with SURF 【发布时间】:2013-08-25 20:19:00 【问题描述】:

以下是我的代码,运行良好,但经过长时间处理后,它显示运行时错误

// Initialize constant values
const int nb_cars = files.size();
const int not_cars = files_no.size();
const int num_img = nb_cars + not_cars; // Get the number of images
// Initialize your training set.
cv::Mat training_mat(num_img,dictionarySize,CV_32FC1);
cv::Mat labels(0,1,CV_32FC1);

std::vector<string> all_names;

all_names.assign(files.begin(),files.end());
all_names.insert(all_names.end(), files_no.begin(), files_no.end());

// Load image and add them to the training set
int count = 0;
vector<string>::const_iterator i;
string Dir;
for (i = all_names.begin(); i != all_names.end(); ++i)

    Dir=( (count < files.size() ) ? YourImagesDirectory : YourImagesDirectory_2);

    Mat row_img = cv::imread( Dir +*i, 0 );

    detector.detect( row_img, keypoints);

    RetainBestKeypoints(keypoints, 20); // retain top 10 key points

    extractor->compute( row_img, keypoints, descriptors_1);

    //uncluster.push_back(descriptors_1);
    descriptors.reshape(1,1);

    bow.add(descriptors_1);

    ++count;


int count_2=0;
vector<string>::const_iterator k;
Mat vocabulary = bow.cluster();
dextract.setVocabulary(vocabulary);


for (k = all_names.begin(); k != all_names.end(); ++k)

    Dir=( (count_2 < files.size() ) ? YourImagesDirectory : YourImagesDirectory_2);

    row_img = cv::imread( Dir +*k, 0 );

    detector.detect( row_img, keypoints);

    RetainBestKeypoints(keypoints, 20);

    dextract.compute( row_img, keypoints, descriptors_1);

    descriptors_1.reshape(1,1);

    training_mat.push_back(descriptors_1);

    labels.at< float >(count_2, 0) = (count_2<nb_cars)?1:-1;

    ++count_2;

错误:

OpenCv Error : Formats of input argument do not match() in unknown function , file ..\..\..\src\opencv\modules\core\src\matrix.cpp, line 652

我在第二个循环中制作了 descriptor_1 以重塑为 SVM 的行,但错误没有解决

【问题讨论】:

如何使用:Mat labelsMat(num_img, CV_32FC1, labels);Mat training_mat(num_img,CV_32FC1, trainingData); @Flying 你想说我的论点没有条理? 【参考方案1】:

我认为您正在尝试使用少于类数量的特征进行聚类。

您可以从每张图像中获取更多图像或超过 10 个描述符。

【讨论】:

+1 ,这可能是错误的原因之一,但是查看错误start after step 6 意味着主要错误在最终/最后一个循环中 @GilLevi 当我逐行检查时,我在这里得到了错误:training_mat.push_back(descriptors_1);【参考方案2】:

到目前为止,我在 3 天后发现我的错误在于标记,当我标记图像时,我在那里得到了错误,是的,上面的答案也与使用较少数量的图像也会导致错误有关,但在我的如果这不是原因,当我开始逐行检查错误时,错误从这里开始:

labels.at< float >(count_2, 0) = (count_2<nb_cars)?1:-1;

因为线:

Mat labels(0,1,CV_32FC1);

而不是:

Mat labels(num_img,1,CV_32FC1);

我应该使用

my_img.convertTo( training_mat.row(count_2), CV_32FC1 );

【讨论】:

以上是关于将 SVM 与 SURF 结合使用时出错的主要内容,如果未能解决你的问题,请参考以下文章

实施 SVM 时出错

Python 中的 SVM 拟合数据集时出错

实现SVM时出错

检查交叉验证 svm 的敏感性和特异性时出错

OpenCV for Android - 使用 SURF 描述符训练 SVM

scikit learn 中 SVM 的 SURF 功能