Проверете дали 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