最近做视频的目标识别和追踪计数,编译连接均没有问题,但是在测试时出现了问题,只要标出的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安全的 计算最小外接矩形:
- CvRect box; vector<float> label_;
- box.x = ((*iter).xmin) * (img.cols);
- box.x = box.x > 0 ? box.x : 0;//必须对rio_rect的值进行“安全控制”,不控制在检测框与图像边缘‘碰撞后’opencv会报错!!
- box.y = ((*iter).ymin) * (img.rows);
- box.y = box.y > 0 ? box.y : 0;// boudRect的左上的x和y有可能小于0
- box.width = (((*iter).xmax) * (img.cols) - ((*iter).xmin) * (img.cols));
- // box的右下点可能大于img的范围
- box.width = box.width < (img.cols-box.x) ? box.width : (img.cols - box.x - 1);
- box.height = (((*iter).ymax) * (img.rows) - ((*iter).ymin) * (img.rows));
- 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);