cvNamedWindow("img",CV_WINDOW_AUTOSIZE);
CvCapture* cap = cvCreateFileCapture("D:\\项目文档\\智能交通\\交通视频\\行人读入视频
if (!cap)
{
cout<<"avi file load error……"<<endl;
system("pause");
exit(-1);
} //检测视频有没有被读入
vector<float> x;
ifstream fileIn("Peopledetector_Lib1019_5.txt", ios::in);
float val = 0.0f;
while(!fileIn.eof())
{
fileIn>>val;
x.push_back(val);
}
fileIn.close();
vector<cv::Rect> found; //检测出的车辆数量
vector<cv::Rect> temp; //用于存放的容器
vector<vector<cv::Rect>> bigfound;
vector< vector<cv::Rect>> ::iterator bigit; //功能强大的迭代器
cv::HOGDescriptor hog(cv::Size(16,32), cv::Size(8,16), cv::Size(8,8), cv::Size(4,8), 9);
hog.setSVMDetector(x); //x向量对应的分类器
IplImage* img = NULL;
IplImage* SizeImg=cvCreateImage(cvSize(240,180),8,3);
IplImage* ShowImage = cvCreateImage(cvSize(320,240),8,3);
FILE* fp = fopen("result.txt","w");
int m=0;
while(1)
{
img=cvQueryFrame(cap);
if( !img ) break;
cvZero(SizeImg);
cvResize(img,SizeImg);
long t1 = GetTickCount();
hog.detectMultiScale(SizeImg, found, 0.07, Size(4, 4), Size(4,4), 1.2, 2,false);
//检测当前帧的HOG特征,found为检测结果向量
int i,j;
vector<cv::Rect> found_filtered;
for (i = 0; i<found.size();i++)
{
Rect r = found[i];
//下面的这个for语句是找出所有没有嵌套的矩形框r,并放入found_filtered中,如果有嵌套的
//话,则取外面最大的那个矩形框放入found_filtered中
for(j = 0; j <found.size(); j++)
if(j != i && (r&found[j])==r)
break;
if(j == found.size())
found_filtered.push_back(r);
}
long t4 = GetTickCount();
cout<<"The number of people is:"<<found_filtered.size(); //检测人数
cout<<" time:"<<t4-t1<<endl;
//在图片img上画出矩形框,因为hog检测出的矩形框比实际人体框要稍微大些,所以这里需要
//做一些调整
cvResize(img,ShowImage);
for(i = 0; i <found_filtered.size(); i++)
{
Rect r = found_filtered[i];
r.x *= (0.38+320/240);
r.width = cvRound(r.width*1.2);
r.y *= (0.42+240/180);
r.height = cvRound(r.height*1.4);
r.y -=10;
r.x -=3;
%%%%
cvSetImageROI(ShowImage,cvRect(r.x,r.y,r.width,r.height));
IplImage* dst1 = cvCreateImage(cvSize(r.width,r.height),8,3);
/*cvNamedWindow("Show_Result");
cvShowImage("Show_Result",ShowImage);*/
cvCopy(ShowImage,dst1);
IplImage*dst = cvCreateImage(cvSize(16,32),8,3);
cvResize(dst1,dst);
cvResetImageROI(ShowImage);
/* stringstream ImageName;
ImageName<<"D:\\program\\matlab projects\\Lib行人数据库\\自举
cvSaveImage(ImageName.str().c_str(),ShowImage);*/
// PatchCount++;
/* cvReleaseImage(&dst);
cvReleaseImage(&dst1);*/
cvRectangle(ShowImage,cvPoint(r.x,r.y),cvPoint(r.x+r.width,r.y+r.height),CV_RGB(0,255,0),1);
}
// cvResize(SizeImg,ShowImage);
cvShowImage("img",ShowImage);
cvWaitKey(30);
}
cvReleaseImage(&img);
// cvReleaseImage(&ShowImage);
cvReleaseImage(&SizeImg);
cvReleaseCapture( &cap );
cvDestroyWindow( "img" );
return 0;
}
一下午,头都晕了,原来是ROI越界了⊙﹏⊙b汗,在%%%处加上一下程序,错误就搞定了!
if (r.x+r.width >= ShowImage->width )
{
r.x = ShowImage->width - r.width-1;
}
if(r.y+r.height >= ShowImage->height)
{
r.y = ShowImage->height - r.height-1;
}
哎,编程也需要缜密细心啊,不然空耗时间。。。