急!!!之前能出结果的程序突然报错:“vector subscript out of range”

ZJY5355 2014-02-06 07:20:03
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <vector>
#include <string>
using namespace cv;
using namespace std;
static int m_normalCropLeftEyePointsSelected[]={19,20,21,22,23,24,95,97,99,101,103,105,107,109};
static int m_normalCropRightEyePointsSelected[]={52,53,54,55,56,57,96,98,100,102,104,106,108,110};void iGetBoundingRectangle(vector<Point>& Points,Rect &leftEye,Rect& RightEye);
int getLineSum(Mat& img,Mat& dst,int method=0)
{
Mat temp = 255-img.clone();
/* imshow("temp",temp);*/
if(method==1)
temp=temp.t();
dst = Mat::zeros(1,temp.cols,CV_32SC1);
int *pDst=dst.ptr<int>(0);;
for(int i=0;i<temp.cols;i++)
{
pDst[i] = sum(temp.col(i)).val[0];
}
int maxSum = sum(dst).val[0]/2,tempSum=0;
int x=0;
for(x=0;x<temp.cols;x++)
{
tempSum += pDst[x];
if(tempSum >= maxSum)
break;
}
return x;
}
void DrawCross(Mat& img,Point core,int length=1)
{
line(img,Point(core.x-length,core.y),Point(core.x+length,core.y),Scalar(0,0,255));
line(img,Point(core.x,core.y-length),Point(core.x,core.y+length),Scalar(0,0,255));
}
int main()
{
Mat M = imread("E:\\yu_1000064.png");
Mat dst = M.clone();
Mat points;
FileStorage fs;
fs.open("E:\\yu_1000064.yml",FileStorage::READ);
fs["Points"]>>points;
vector<Point> vPoints;
int *pSrc;
for(int i=0;i<points.rows;i++)
{
pSrc = points.ptr<int>(i);
vPoints.push_back(Point(pSrc[0],pSrc[1]));
}
Rect EyesRect[2];

iGetBoundingRectangle(vPoints,EyesRect[0],EyesRect[1]);
Mat EyesMat[2],DectectEyes[2];
EyesMat[0]=M(EyesRect[0]).clone();
EyesMat[1]=M(EyesRect[1]).clone();
char ss[50];
for(int i=0;i<2;i++)
{
sprintf(ss,"原始图像Eye-%d.png",i);
imwrite(ss,EyesMat[i]);
cvtColor(EyesMat[i],EyesMat[i],CV_BGR2GRAY);
sprintf(ss,"灰度化Eye-%d.png",i);
imwrite(ss,EyesMat[i]);
//直方图均衡
equalizeHist(EyesMat[i],EyesMat[i]);
sprintf(ss,"直方图均衡Eye-%d.png",i);
imwrite(ss,EyesMat[i]);
DectectEyes[i]=EyesMat[i];
//二值化
threshold(EyesMat[i],DectectEyes[i],45,255,CV_THRESH_BINARY);

sprintf(ss,"二值化Eye-%d.png",i);
imwrite(ss,DectectEyes[i]);

//闭运算
int erosion_size = 1;
Mat element = getStructuringElement( MORPH_CROSS,
Size( 2*erosion_size + 1, 2*erosion_size+1 ),
Point( erosion_size, erosion_size ) );
dilate(EyesMat[i], EyesMat[i], element);
erode( EyesMat[i], EyesMat[i], element );

//resize(DectectEyes[i],DectectEyes[i],Size(DectectEyes[i].cols*5,DectectEyes[i].rows*5));

sprintf(ss,"闭运算Eye-%d.png",i);
imwrite(ss,DectectEyes[i]);

Mat temp;

int x = getLineSum(DectectEyes[i],temp,0);
int y = getLineSum(DectectEyes[i],temp,1);
cout<<x<<" "<<y<<endl;
DrawCross(M,Point(x+EyesRect[i].x,y+EyesRect[i].y));
}

sprintf(ss,"最后结果Eye.png");
imwrite(ss,M);

imshow("outPut",M);
waitKey(0);
return 0;
}

void iGetBoundingRectangle(vector<Point>& Points,Rect &leftEye,Rect& rightEye)
{
int left,right,up,down;
int numP=Points.size();
int numL= sizeof(m_normalCropLeftEyePointsSelected)/sizeof(int);
int numR= sizeof(m_normalCropRightEyePointsSelected)/sizeof(int);
int x,y;
if(numL > 0)
{
if(m_normalCropLeftEyePointsSelected[0]>=numP);
x = Points[m_normalCropLeftEyePointsSelected[0]].x;
y = Points[ m_normalCropLeftEyePointsSelected[0]].y;
left = right = x;
up = down = y;
// left= right =x;
// up = down =y;
}
for(int i=1;i<numL;i++)
{
if(m_normalCropLeftEyePointsSelected[i]>=numP);
x = Points[m_normalCropLeftEyePointsSelected[i]].x;
y = Points[m_normalCropLeftEyePointsSelected[i]].y;
if(x<left) left=x;
if(x>right) right=x;
if(y<up) up=y;
if(y>down) down=y;
}
if(left<0) left=0;
if(up<0) up=0;
if(down>479) down=479;
if(right>639) right=639;
leftEye = Rect(left,up,right-left,down-up);
//////////////////////////////////////////////////////////////
if(numR > 0)
{
if(m_normalCropRightEyePointsSelected[0]>=numP);
x = Points[m_normalCropRightEyePointsSelected[0]].x;
y = Points[ m_normalCropRightEyePointsSelected[0]].y;
left = right = x;
up = down = y;
// left= right =x;
// up = down =y;
}
for(int i=1;i<numR;i++)
{
if(m_normalCropRightEyePointsSelected[i]>=numP);
x = Points[m_normalCropRightEyePointsSelected[i]].x;
y = Points[m_normalCropRightEyePointsSelected[i]].y;
if(x<left) left=x;
if(x>right) right=x;
if(y<up) up=y;
if(y>down) down=y;
}
/////////////////////////////////////////////////////////////;
if(left<0) left=0;
if(up<0) up=0;
if(down>479) down=479;
if(right>639) right=639;
rightEye = Rect(Point(left,up),Point(right,down));
}
整个代码如上,以前运行时能通过出结果的,今天不知道怎么回事,运行到iGetBoundingRectangle(vPoints,EyesRect[0],EyesRect[1]);一步时跳出如下错误提示:
File:c:C:\Program Files\Microsoft Visual Studio 10.0\VC\include
Line:932

Expression:vector subscript out of range
可是下标没有越界啊,我都用pushback的...
而且以前都能出结果的!求各位大神帮忙试试!看有没有出错额!
...全文
820 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sduxiaoxiang 2014-02-08
  • 打赏
  • 举报
回复
访问越界了吧
MichelleKdf 2014-02-08
  • 打赏
  • 举报
回复
LZ 是一楼大虾说的文件的问题吗?
ztenv 版主 2014-02-07
  • 打赏
  • 举报
回复
增加日志,如果问题能重现;
greex 2014-02-07
  • 打赏
  • 举报
回复
iGetBoundingRectangle(vPoints,EyesRect[0],EyesRect[1]);把EyesRect的值打印出来看看。
ZJY5355 2014-02-07
  • 打赏
  • 举报
回复
更正:这个程序是嵌在kinect人脸追踪那个程序上的,已经能做到跟踪到人脸、瞳孔,但是加了上面那个getpoint以后,一旦人脸和瞳孔追踪到,就会出现上面那个对话框,卡死
ZJY5355 2014-02-07
  • 打赏
  • 举报
回复
谢谢楼上!
我想将程序中的一个点显示在mfc界面,于是添加了:

afx_msg LRESULT CFRSYSDlg::OnGetPoint(WPARAM wParam, LPARAM lParam)
{
int *b;
b=m_fr.getpointx();

CString strpoints ;
strpoints.Format(_T("%d%d"),b[0],b[1]);

// strpoints=m_fr.putpoints2cstring();
((CListBox *)GetDlgItem(IDC_LIST1))->InsertString(-1,strpoints);
}
getpointx在cpp中的:int* FR::getpointx(void)
{
int *m;
m= new int [2];
for(int j=0;j<v.size();j++)
{
m[j]=v[j].x;
}
return m;
}
然后运行时弹出了这个对话框:

请问楼上知道是怎么回事吗?初学者太菜了,望能指教!谢过谢过!
ZJY5355 2014-02-07
  • 打赏
  • 举报
回复
谢谢楼上!我也觉得挺繁琐的,但是不知道怎么才能简化呢?楼上大侠有没有什么好建议?
minchieh_fay 2014-02-07
  • 打赏
  • 举报
回复

bool input();
bool checkdata();
bool active();
bool output();

#define RUN_WHEN_ERROR_THEN_RET(FUN,ERRMSG) \
do{ \
      if(FUN() == false) {printf("%s\n", ERRMSG); return;}
}while(0)

void main()
{
   RUN_WHEN_ERROR_THEN_RET(input, "数据采集失败");
   RUN_WHEN_ERROR_THEN_RET(checkdata, "数据验证失败");
   RUN_WHEN_ERROR_THEN_RET(active, "数据处理失败");
   RUN_WHEN_ERROR_THEN_RET(output, "数据结果打印失败");
}
1.尽量将main函数弄简单,他只负责调用接口 2.数据有校验过程,当然active里面还可以再加逻辑判断和规则判断 3.尽量不要使用成员变量,弄成函数的入参,这样可以有效提高你函数的复用性, 不然会被你的成员变量或者全局变量弄死的
minchieh_fay 2014-02-07
  • 打赏
  • 举报
回复
真理是:E:\\yu_1000064.yml这份文件被改过,或者没找到这份文件 iGetBoundingRectangle函数中 在使用Points[m_normalCropLeftEyePointsSelected[i]]和Points[m_normalCropLeftEyePointsSelected[0]] 前面加异常 if(Points.size() <= m_normalCropLeftEyePointsSelected[i或者0]){throw "vector subscript out of range";} 这个代码写的繁琐,而且一点都不安全, m_normalCropLeftEyePointsSelected中写死的数据都挺大的,vecotr万一没读到数据,或者数据读的不够多,直接崩掉......还不行就抓个dump下来 windbg调试下

65,210

社区成员

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

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