视频目标检测中关于对检测出的目标进行”安全处理“问题

最近做视频的目标识别和追踪计数,编译连接均没有问题,但是在测试时出现了问题,只要标出的box与视频的边界接触就会出现程序崩溃,并提示出opencv的断言提示:

OpenCV Error: Assertion failed (0 <= roi.x && 0 <= roi.width && roi.x + roi.width<= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows) incv::Mat::Mat

如下图所示:


用不同的视频进行测试,才发现只要标出的box与视频的边界接触就会出现程序崩溃,所以对这个问题进行了搜索和解决,问题的症结在于box的坐标越界了。也就是

box返回的可能是一个负坐标,或者是一个超过原图片外界的坐标。于是这时把Rect作为参数传递给Mat(Rect ...)的话,它会提示你所要截取的Rect中的坐标越界了!


解决方法就是对rec赋予一个  t安全的  计算最小外接矩形:

[cpp]  view plain  copy
  1. CvRect box; vector<float> label_;  
  2. box.x = ((*iter).xmin) * (img.cols);   
  3.        box.x = box.x > 0 ? box.x : 0;//必须对rio_rect的值进行“安全控制”,不控制在检测框与图像边缘‘碰撞后’opencv会报错!!  
  4. box.y  =  ((*iter).ymin) * (img.rows);  
  5.        box.y = box.y > 0 ? box.y : 0;// boudRect的左上的x和y有可能小于0  
  6. box.width = (((*iter).xmax) * (img.cols) - ((*iter).xmin) * (img.cols));   
  7. // box的右下点可能大于img的范围  
  8.        box.width = box.width < (img.cols-box.x)  ? box.width : (img.cols - box.x - 1);  
  9. box.height = (((*iter).ymax) * (img.rows) - ((*iter).ymin) * (img.rows));  
  10.        box.height = box.height < (img.rows - box.y) ? box.height : (img.rows - box.y - 1);  

这样问题就解决了!

[cpp] view plain copy

r.x=r.x>0?r.x:0;
r.y=r.y>0?r.y:0;
r.width = r.width<(src.cols-r.x)?r.width: (src.cols - r.x - 1);
r.height =r.height<(src.rows-r.y)?r.width: (src.rows - r.y - 1);

猜你喜欢

转载自blog.csdn.net/ZHAGNQ/article/details/80298214