Проверьте, находится ли cvRect в cvMat

Я использую ограничивающие рамки, чтобы найти текст на изображении, и иногда они просто слишком малы и обрезают части текста сверху и снизу.

введите описание изображения здесь

Поэтому я решил немного расширить каждую ограничивающую рамку, чтобы компенсировать неточность.

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

Как я могу проверить, что прямоугольник находится в границах изображения и избежать этой ошибки, все еще расширяя ограничивающие рамки?

1

Решение

Как говорит ошибка, ваш 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());
4

Другие решения