【问题标题】:Run time vector error in loop循环中的运行时向量错误
【发布时间】:2013-08-03 17:30:01
【问题描述】:

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

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 上的错误 这是错误 有时它

【问题讨论】:

  • 你应该检查向量的大小至少是num_img
  • 必须有一个 .size() 函数来给出元素的数量。文件大小()
  • 是的,我检查了这个,它是 42,
  • 使用调试器...跟随循环直到它崩溃。

标签: c++ visual-c++ opencv image-processing computer-vision


【解决方案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,然后循环遍历向量的内容。

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

【讨论】:

  • 我知道 all 的大小,文件大小是 13,循环大小是 42
  • @Flying there you go,这是一个越界访问。
  • 我将其更改为for(int i = 0 ; i &lt; files.size() ; ++i ),但现在它向我抛出了黑屏错误,我在我的问题中进行了更新
  • @Flying 我宁愿只使用std::vector&lt;std::string&gt;::const_iteratorfiles.end(),这完全可以确保没有索引非法访问。 Juan 精通这一点(并且在这个答案的第二段的最后一句中避开了它),但对于 OP 来说似乎并非如此。 C++ 迭代器(通常)使您免于麻烦,并且非常灵活。利用它。
【解决方案2】:

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

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;
}

【讨论】:

  • 不,如果他要使用迭代器,他应该使用const_iterator
  • 正确的想法,错误的迭代器。更改此答案以使用const_iterator,您很可能会收回您的选票。 (并注意 *it 用于对象级访问,it-&gt;memberfn() 用于功能访问以清楚起见)。
  • @WhozCraig 您在上面的评论中询问这个答案?我不明白std::vector&lt;std::string&gt;::const_iterator
  • 使用这个给我这一行的错误tmp_img = imread( files.at(i), 0 );
  • @Flying 在任何情况下,您认为可以遍历files 向量中的num_img 条目这一事实表明您的代码中有问题。循环遍历vector的元素可以解决一个问题,但是你要明白为什么num_imgfiles的大小不一致。
【解决方案3】:

不要使用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;
}

【讨论】:

  • 它仍然给我在我的问题中更新的黑屏错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
相关资源
最近更新 更多