Проверьте, находится ли 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

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


person Clip    schedule 11.05.2014    source источник


Ответы (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()); 
person tofi9    schedule 12.05.2014
comment
О, спасибо, я сделаю снимок. Кажется элегантным решением. Я попробую это после обеда! Я получаю сообщение об ошибке No matching call to 'max'. Кажется, что appRect.x-Z - это какой-то тип объекта, а не числовое значение. - person Clip; 12.05.2014
comment
Вероятно, вам не хватает включения для std :: max (это #include ‹algorithm›). см. cplusplus.com/reference/algorithm/max. На странице также есть эталонная реализация, которую вы можете использовать. - person tofi9; 12.05.2014
comment
Кажется, все еще возникает ошибка даже во фрагменте кода, есть идеи? - person Clip; 12.05.2014
comment
попробуйте принудительно установить тип параметров std::max<int>(0, appRect.x-Z) или добавить несколько приведений std::max(0, (int)appRect.x-Z) - person tofi9; 12.05.2014
comment
@Nick Почему бы не пересечь расширенный Rect с Rect, представляющим границы матрицы? Что-то а-ля expandedRect &= Rect(Point(0, 0), mat.size())? Намного короче и чище. - person Iwillnotexist Idonotexist; 12.05.2014