0

我的程序给了我向量迭代的运行时错误,下面是我的代码

for (i = 0; i != num_img; ++i)
{
    tmp_img = imread( files[i], 0 ); // load in grayscale.
    resize( tmp_img, tmp_dst, tmp_dst.size() );
    Mat row_img = tmp_dst.reshape( 1, 1 ); // get a one line image.
    row_img.convertTo( training_mat.row(i), CV_32FC1 );
    labels.at< float >(count, 0) = (count<nb_cars)?1:-1; // 1 for car, -1 otherwise*/
}

当我逐行检查时,它显示tmp_img循环中的错误是错误 在此处输入图像描述 ,有时 是错误在此处输入图像描述

4

3 回答 3

1

最可能的情况是您在files此处访问超出范围的向量:

for(int i = 0 ;  i < num_img ; i++ )
{
   tmp_img = imread( files[i], 0 ); // i could be larger than files.size()

您应该确保不会访问超出范围的向量。使用std::vector::size()方法。您可以检查num_img小于或等于files.size(),或完全删除num_img,然后循环遍历向量的内容。

编辑越界访问向量是一个错误,并导致未定义的行为。如果您的程序这样做,那么它是不正确的,必须修复。

于 2013-08-03T17:36:06.443 回答
0

不要使用operator []
你会更好,.at() 因为它检查是否在范围内,如果不在范围内则i抛出。out_of_range

string YourImagesDirectory="D:\\pics\\";
vector<string> files=listFilesInDirectory(YourImagesDirectory+"*.jpg");
for(size_t i = 0 ;  i < num_img ; i++ )
{
    try
    {
        tmp_img = imread( files.at(i), 0 );
    }
    catch(const std::out_of_range& e)
    {
         std::cerr << "num_img is bigger than files.size()!" << std::endl;
         std::cerr << "Exception caught! (out_of_range): " << e.what() << std::endl;
         break;
    }
    resize( tmp_img, tmp_dst, tmp_dst.size() );
    Mat row_img = tmp_dst.reshape( 1, 1 );
    row_img.convertTo( training_mat.row(i), CV_32FC1 );
    labels.at< float >(i, 0) = (i<nb_cars)?1:-1;
}
于 2013-08-03T17:38:49.047 回答
0

尝试使用迭代器。它们可以帮助您保持在范围内;

int count = 0;
vector<string>::const_iterator i;
for (i = files.begin(); i != files.end(); ++i){
{
    tmp_img = imread( *i, 0 ); // load in grayscale.
    resize( tmp_img, tmp_dst, tmp_dst.size() );
    Mat row_img = tmp_dst.reshape( 1, 1 ); // get a one line image.
    // copy line and convert to float
    row_img.convertTo( training_mat.row(count), CV_32FC1 );
    labels.at< float >(count, 0) = (count<nb_cars)?1:-1; // 1 for car, -1 otherwise*/
    ++count;
}
于 2013-08-03T17:40:59.600 回答