急!!!之前能出结果的程序突然报错:“vector subscript out of range”
#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的...
而且以前都能出结果的!求各位大神帮忙试试!看有没有出错额!