C++关于vector的越界的问题

hawjb528 2014-03-18 11:15:16
愚生在编代码时遇到这么一个问题~部分代码如下:
if(!Frame.empty())
{
learningFrameNum++;
if(learningFrameNum < 100)
{
gaussBGModel.updateBG(learningFrameNum,Frame,0.01f);
gaussBGModel.getBGImage(bg);
//printf("%f %f\r\n",352, 288);
Vec3b v = bg(40,150);
printf("frameNum = %d r = %d g = %d b = %d\r\n",learningFrameNum,v[0],v[1],v[2]);
GaussModel gm = gaussBGModel.gmm[40*352+150];
for ( int i = 0;i < gm.currModeNum; i++)
{
printf("frameNum = %d weight[%d] = %f variance[%d] = %f r = %f g = %f b = %f\r\n", learningFrameNum,i,gm.weight[i],i,gm.variance[i],gm.mean[i][0],gm.mean[i][1],gm.mean[i][2]);
}
}
else
{
gaussBGModel.detectFG(learningFrameNum,Frame,grayMask);

namedWindow("fg",0);
imshow("fg",grayMask);
waitKey(1);

morphologyEx(grayMask,grayMask,CV_MOP_OPEN,Mat(),Point(-1,-1),2);
morphologyEx(grayMask,grayMask,CV_MOP_CLOSE,Mat(),Point(-1,-1),2);
vector<vector<Point> > currContours;
//currContours.resize( 2000);
findContours(grayMask, currContours, cv::noArray(), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
if(currContours.size() <= 0)
{
//continue;
}
threshold(grayMask,grayMask,0,255,CV_THRESH_BINARY);
grayUpdateRectMask.setTo(0);
for(unsigned i=0; i < currContours.size(); i++)
{
Rect rect = boundingRect(currContours[i]);
rectangle(grayUpdateRectMask,rect,Scalar(255),CV_FILLED);
}
gaussBGModel.updateBG(learningFrameNum,Frame,0.01f,grayUpdateRectMask);

}




//namedWindow("grayUpdateRectMask",0);
// imshow("grayUpdateRectMask",grayUpdateRectMask);
// waitKey(1);
//string name =( _T("video"));
namedWindow("video",0);
imshow("video",Frame);
waitKey(1);

//namedWindow("grayMask",0);
// imshow("grayMask",grayMask);
// waitKey(1);


gaussBGModel.getBGImage(bg);
namedWindow( "bg",0);
imshow("bg",bg);
waitKey(1);

//if(waitKey(5) == 27)
{
//break;
}
}

程序运行会报错:
vector subscript out of range
上网查阅,加了个//currContours.resize( 2000); ~可是还是报这样的错误~请问各位大神,有什么方法可以解决这个问题吗~代码该怎么改呢
...全文
784 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fkseraph 2015-09-22
  • 打赏
  • 举报
回复
你注释了GaussBGModel::GaussBGModel()和GaussBGModel::~GaussBGModel()的实现,怎么可能编译通过
赵4老师 2014-03-20
  • 打赏
  • 举报
回复
偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译,直到定位到具体语法出错的位置。” 的方法解决的。
zhuobattle 2014-03-18
  • 打赏
  • 举报
回复
F5调试看下,问题出在哪行
hawjb528 2014-03-18
  • 打赏
  • 举报
回复
引用 8 楼 zhuyf87 的回复:
代码太乱了,貌似贴的也不全。单步调试一下吧,应该就是vector的下标访问了不存在的元素。
哈哈~这个问题解决了~确实是有不存在的元素~可是改了之后又有个新问题了~这里是.cpp文件
#include "gaussbgmodel.h"
#include "stdafx.h"

GaussBGModel::GaussBGModel()
//{
//}

GaussBGModel::~GaussBGModel()
//{
//
//}

void GaussBGModel::prepare(int Rows, int Cols)
{
    mRows = Rows;
    mCols = Cols;

    // 创建背景模型
    gmm.clear();
    gmm.resize(mRows * mCols);
}

void GaussBGModel::detectFG(int FrameNum, const Mat3b &CurrFrame, Mat1b &GrayFGMask)
{
    // 预处理掩码矩阵
    Mat1b currMask = Mat1b(mRows, mCols, BGPixel);

    // 遍历当前帧中的像素
    for(int row = 0; row < CurrFrame.rows; row++)
    {
        for(int col = 0; col < CurrFrame.cols; col++)
        {
            // 确定该像素对应的高斯模型的下标
            int index = row * CurrFrame.cols + col;

            // 进行前景检测
            uchar pixelValue = gmm[index].detect(CurrFrame(row, col));

            // 给掩码矩阵赋值
            currMask(row, col) = pixelValue;
        }
    }
    currMask.copyTo(GrayFGMask);
}

void GaussBGModel::updateBG(int FrameNum, const Mat3b &CurrFrame, float LearningRate, InputArray BlobMask, InputArray RectMask)
{
    // 更新率小于等于0.f,返回
    if( LearningRate <= 0.f )
    {
        return;
    }

    // 得到前景掩码矩阵
    Mat1b blobMask = BlobMask.getMat();
    Mat1b rectMask = RectMask.getMat();

    // 如为空,则不需要检测前景团块掩码
    bool checkBlobMaskFlag = blobMask.empty()? false : true;

    // 如果为空,则不需要考虑前景外接矩形掩码
    bool checkRectMaskFlag = rectMask.empty()? false : true;

    for( int row = 0; row < CurrFrame.rows; row++ )
    {
        for( int col = 0; col < CurrFrame.cols; col++ )
        {
            // 确定该像素对应的高斯模型的下标
            int index = row * CurrFrame.cols + col;

            // 对于当前像素实际分量数量小于0的、前景掩码所在像素(!=0)不做更新
            if( gmm[index].currModeNum < 0 || ( checkBlobMaskFlag && blobMask(row, col) ) )
            {
                continue;
            }

            if( checkRectMaskFlag && rectMask(row,col) )
            {
                // 在团块外接矩形内部的,用很低的更新率
                gmm[index].build(CurrFrame(row, col), 0.001f);
            }
            else
            {
                // 用全局的更新率
                gmm[index].build(CurrFrame(row, col), LearningRate);
            }
        }
    }
}

// 返回背景图像(彩色)
void GaussBGModel::getBGImage(Mat3b& BGImage) const
{
    if( mRows < 1 )
    {
        return;
    }

    BGImage.create(mRows, mCols);

    for(int row = 0; row < mRows; row++)
    {
        for(int col = 0; col < mCols; col++)
        {
            int index = row * mCols + col;
            BGImage(row, col) = gmm[index].bgImage();
        }
    }
}
然后这是.h文件
#ifndef GAUSSBGMODEL_H
#define GAUSSBGMODEL_H

#include "gaussmodel.h"

using namespace std;

class GaussBGModel
{
public:
    GaussBGModel();
    ~GaussBGModel();

    /// 预处理
    void prepare(int Rows, int Cols);

    /// 检测前景
    void detectFG(int FrameNum, const Mat3b &CurrFrame, Mat1b &GrayFGMask);

    /// 更新背景模型
    void updateBG(int FrameNum, const Mat3b &CurrFrame, float LearningRate = 0.01,
                  InputArray BlobMask = cv::noArray(), InputArray RectMask = cv::noArray());

    /// 返回背景图像(彩色)
    void getBGImage(Mat3b &BGImage) const;

public:
    int mRows,mCols;            ///< 行列数
    vector<GaussModel> gmm;     ///< 背景模型
};

#endif // GAUSSBGMODEL_H
~ 可是运行后报这样的错误 错误 21 error C2653: “GaussBGModel”: 不是类或命名空间名称 d:\mybackup\我的文档\visual studio 2010\projects\show\show\gaussbgmodel.cpp 4 错误 22 error C2653: “GaussBGModel”: 不是类或命名空间名称 d:\mybackup\我的文档\visual studio 2010\projects\show\show\gaussbgmodel.cpp 8~ 可是我头文件里已经写了类~为啥还报错呢
zhuyf87 2014-03-18
  • 打赏
  • 举报
回复
代码太乱了,貌似贴的也不全。单步调试一下吧,应该就是vector的下标访问了不存在的元素。
hawjb528 2014-03-18
  • 打赏
  • 举报
回复
引用 5 楼 xuddk727 的回复:
[quote=引用 4 楼 hawjb528 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] 崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
 #if _ITERATOR_DEBUG_LEVEL == 2
		if (size() <= _Pos)
			{	// report error
			_DEBUG_ERROR("vector subscript out of range");
			_SCL_SECURE_OUT_OF_RANGE;
			}
是在这边错了啊[/quote] 堆栈定位到你自己的代码看看哪行[/quote] vector<vector<Point> > currContours; //currContours.resize( 2000); findContours(grayMask, currContours, cv::noArray(), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); if(currContours.size() <= 0) { //continue; } 我想这边有问题~应该是
hawjb528 2014-03-18
  • 打赏
  • 举报
回复
引用 5 楼 xuddk727 的回复:
[quote=引用 4 楼 hawjb528 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] 崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
 #if _ITERATOR_DEBUG_LEVEL == 2
		if (size() <= _Pos)
			{	// report error
			_DEBUG_ERROR("vector subscript out of range");
			_SCL_SECURE_OUT_OF_RANGE;
			}
是在这边错了啊[/quote] 堆栈定位到你自己的代码看看哪行[/quote]
vector<vector<Point> >  currContours;                 //currContours.resize( 2000);                                   findContours(grayMask, currContours, cv::noArray(), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);                 if(currContours.size() <= 0)                 {                     //continue;                 } 
这边的代码错了,可是我加了currContours.resize(2000); 还是不行啊
许文君 2014-03-18
  • 打赏
  • 举报
回复
引用 4 楼 hawjb528 的回复:
[quote=引用 3 楼 zhao4zhong1 的回复:] 崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
 #if _ITERATOR_DEBUG_LEVEL == 2
		if (size() <= _Pos)
			{	// report error
			_DEBUG_ERROR("vector subscript out of range");
			_SCL_SECURE_OUT_OF_RANGE;
			}
是在这边错了啊[/quote] 堆栈定位到你自己的代码看看哪行
hawjb528 2014-03-18
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
 #if _ITERATOR_DEBUG_LEVEL == 2
		if (size() <= _Pos)
			{	// report error
			_DEBUG_ERROR("vector subscript out of range");
			_SCL_SECURE_OUT_OF_RANGE;
			}
是在这边错了啊
赵4老师 2014-03-18
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
hawjb528 2014-03-18
  • 打赏
  • 举报
回复
引用 1 楼 zhuobattle 的回复:
F5调试看下,问题出在哪行
调试过了,就是弹出一个错误框,说 vector subscript out of range

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧