关于 Debug Error! R6010 abort() has been call

 今天倒腾了半天,先把整个代码贴出来,本意是想把用矩形框选出来的行人目标截取出来保存,结果遇到“Debug Error! R6010 abort() has been call”这个问题,上网查了半天,作者的回答也无济于事,一步一步调试,程序运行了两帧,到cvcopy就出错了。。。开始以为是网上所说的多线程的问题。

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行人数据库\\自举

\\"<<PatchCount<<".bmp";
     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;
     }

 

哎,编程也需要缜密细心啊,不然空耗时间。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值