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()
因为它检查SIFi
是否在范围内,如果
不在范围内,则将抛出
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
与文件的大小不一致>.它仍然给我在我的问题中更新的黑屏错误