Я использую ограничивающие рамки, чтобы найти текст на изображении, и иногда они просто слишком малы и обрезают части текста сверху и снизу.
Поэтому я решил немного расширить каждую ограничивающую рамку, чтобы компенсировать неточность.
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
Как я могу проверить, что прямоугольник находится в границах изображения и избежать этой ошибки, все еще расширяя ограничивающие рамки?
Как говорит ошибка, ваш 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());