Понимание Rect в переполнении стека OpenCV

Я пытаюсь отметить пиксели внутри прямоугольника. Прямоугольник, который должен быть отмечен, определяется в конструкции if-else. Я получаю следующую ошибку при использовании прямоугольников, которые определены в любом из блоков if-else:
«Утверждение не удалось (0 <= roi.x && 0 < = roi.width && roi.x + roi.width <= m.cols && 0 <= roi.height && roi.y + roi.height <= m.rows) «

Вот фрагмент кода, который я использую:

if (faces.size() != 0){r = faces[0];}
if (eyes.size()!=0){r2 = eyes[0];}

markers(image.rows,image.cols)
if(faces.size() == 0){
cout << "No Face found";
rectangle_face = rectangle_old;
rectangle_inner = rectangle_inner_old;
rectangle_outer = rectangle_outer_old;
}
else {
pt1.x = r.x;
pt1.y = r.y;
pt2.x = pt1.x + r.width;
pt2.y = pt2.y + r.height;

pt1_inner.x = r.x + (r.width)/3;
pt1_inner.y = r.y + (r.height)/3;
pt1_outer.x = pt1.x;
pt1_outer.y = pt1.y;

pt2_inner.x = pt2.x - (r.width)/3;
pt2_inner.y = pt2.y - (r.height)/3;
pt2_outer.x = pt2.x;
pt2_outer.y = image.rows;

rectangle_face = r;
rectangle_inner = Rect(pt1_inner,pt2_inner);
rectangle_outer = Rect(pt2_outer,pt2_outer);
}//rectangle_inner = Rect(pt1_inner,pt2_inner);
//rectangle_outer = Rect(pt2_outer,pt2_outer);

rectangle_old = rectangle_face;
rectangle_outer_old = rectangle_outer;
rectangle_inner_old = rectangle_inner;// Setting all pixels to possible background first
markers.setTo(cv::GC_PR_BGD);

//It get stuck at the following two lines
cv::Mat1b fg_seed_inside_face = markers(rectangle_inner);
//Marking pixels in order. Note: Order is important here.
cv::Mat1b Prfg_seed_FaceExtended = markers(rectangle_outer);

‘Faces’ — это вектор прямоугольников, возвращаемых с обнаружением MultiScale.
Меня сбивает с толку то, что если я объявляю rectangle_inner и rectangle_outer вне блоков if-else (как это закомментировано в фрагменте кода, прямо под условием else), код прекрасно работает для случая, когда условие if неправда. Поэтому в основном я должен объявить мой rectangle_inner и rectangle_outer вне блоков if-else, что не имеет смысла. Есть ли обходной путь?

0

Решение

Когда вы вычисляете (x, y) координаты ваших внутренних и внешних точек, чтобы построить свои прямоугольники, вы должны проверить, что координаты, которые вы получаете, добавляя или вычитая в pt1 или pt2 r.weight или r.height, не выйти из образа. Это довольно распространенное явление, когда ваше лицо близко к краю вашего изображения.

Это можно легко сделать, сделав что-то вроде

pt1.x = r.x;
pt1.y = r.y;
pt2.x = pt1.x + r.width;
if(pt2.x >= image.cols) //check that coordinate pt2.x doesn't get out of the image
pt2.x = image.cols;

pt2.y = pt2.y + r.height;
if(pt2.y >= image.rows) //check that coordinate pt2.y doesn't get out of the image
pt2.y = image.rows;

И повторите проверку для каждой координаты, которую вы вычисляете. Когда вы вычитаете, просто проверьте, что координаты> = 0 и установите их в 0, если они не.

Надеюсь, поможет..

1

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


По вопросам рекламы [email protected]