Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 循环中的运行时向量错误_C++_Visual C++_Opencv_Image Processing_Computer Vision - Fatal编程技术网

C++ 循环中的运行时向量错误

C++ 循环中的运行时向量错误,c++,visual-c++,opencv,image-processing,computer-vision,C++,Visual C++,Opencv,Image Processing,Computer Vision,我的程序给出了向量迭代的运行时错误,下面是我的代码 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.conv

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

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*/
}
for(i=0;i!=num\u img;++i)
{
tmp_img=imread(文件[i],0);//以灰度加载。
调整大小(tmp_img、tmp_dst、tmp_dst.size());
Mat row_img=tmp_dst.reformate(1,1);//获取一行图像。
第2行img.CONVERTO(培训材料第(i)行,CV\U 32FC1);

labels.at(count,0)=(count最可能的情况是您访问的
文件
向量超出了此处的范围:

for(int i = 0 ;  i < num_img ; i++ )
{
   tmp_img = imread( files[i], 0 ); // i could be larger than files.size()
for(int i=0;i
您应该确保访问的向量不超出范围。请使用该方法。您可以检查
num\u img
是否小于或等于
files.size()
,或者完全删除
num\u img
,然后循环向量的内容


编辑访问超出边界的向量是一个错误,会导致未定义的行为。如果您的程序执行此操作,则它是不正确的,必须进行修复。

不要使用
运算符[]

使用
.at()
因为它检查SIF
i
是否在范围内,如果
不在范围内,则将
抛出

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;
}
string yourmagesdirectory=“D:\\pics\\”;
vector files=listFilesInDirectory(YourImagesDirectory+“*.jpg”);
对于(大小i=0;i试着使用迭代器。它们可以帮助你保持范围

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;
}
int count=0;
向量::常量迭代器i;
对于(i=files.begin();i!=files.end();+i){
{
tmp_img=imread(*i,0);//以灰度加载。
调整大小(tmp_img、tmp_dst、tmp_dst.size());
Mat row_img=tmp_dst.reformate(1,1);//获取一行图像。
//复制行并转换为浮点
行img.convertTo(培训材料行(计数),CV\u 32FC1);

labels.at(count,0)=(count您应该检查向量的大小是否至少为
num\u img
。必须有一个.size()函数来提供元素数.files.size()是的,我检查这个,它是42,使用一个调试器…跟随循环直到它崩溃。我知道所有的大小,文件大小是13,循环大小是42@Flying好了,这是一个越界访问。我将其更改为
for(inti=0;i
但现在它给我带来了黑屏的错误,我在我的question@Flying我更喜欢只使用
std::vector::const_迭代器
而不是
files.end()
,这可以确保没有索引非法访问。Juan对此非常精通(在这个答案的第二段的结尾句中,它避开了它),但是对于op.C++迭代器来说,这通常不会让你摆脱麻烦(通常)。而且非常灵活。利用这一点。不,如果他打算使用迭代器,他应该使用
const_迭代器
。想法正确,迭代器错误。将此答案更改为使用
const_迭代器
,您很可能会得到您的投票。(注意
*it
用于对象级访问,以及
it->memberfn()
用于功能访问以保持清晰)。@WhozCraig您在上面的评论中询问了这个答案?我不理解
std::vector::const\u迭代器
使用它可以在这一行告诉我错误
tmp\u img=imread(files.at(i),0)
@无论如何,你认为你可以在
文件
向量中的
num\u img
项上循环,这表明你的代码有问题。循环向量的元素可以解决一个问题,但你必须理解为什么
num\u img
文件的大小不一致>.它仍然给我在我的问题中更新的黑屏错误