我正在使用边界框来查找图像中的文本,有时框太小而且切掉了顶部和底部的文本部分。
所以我想我会扩展每个边界框以弥补不准确性。
double Z = 10;
cv::Rect extended( appRect.x-Z, appRect.y-Z, appRect.width+2*Z, appRect.height+2*Z);
appRect
是cv::Rect
这就是我正在寻找的东西,但似乎有时它会使边界框超出范围。
给我这个错误:
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) in Mat
如何检查矩形是否在图像的边界内,并在扩展边界框时避免此错误?
答案 0 :(得分:4)
如错误所示,您的x
,y
,w
和h
不允许为否定。
尝试添加std::max()
和std::min()
:
#include <algorithm> // std::max && std::min
int Z = 10;
int x = std::max<int>(0, appRect.x-Z);
int y = std::max<int>(0, appRect.y-Z);
int w = std::min<int>(mat.cols - x, appRect.width+2*Z);
int h = std::min<int>(mat.rows - y, appRect.height+2*Z);
cv::Rect extended(x, y, w, h);
或Iwillnotexist聪明地建议:
// expand
double Z = 10;
cv::Rect extended( appRect.x-Z, appRect.y-Z, appRect.width+2*Z, appRect.height+2*Z);
// intersect
extended &= Rect(Point(0, 0), mat.size());