Я пытаюсь понять ваш вопрос, но здесь есть некоторые проблемы с именами: ROI в openCV — это прямоугольная область, которую можно описать, например, классом Rect:
int x=3, y=5, width=10, height=15;
Rect roi(x, y, width, height);
Mat m(100, 100, CV_8UC3);
m = Scalar(0);
m(roi) = 255;
То, что вы здесь показываете, выглядит как маска, не ограниченная прямоугольной формой, например:
Mat mask, img;
img = mask & img;
Все показанные сегменты маски касаются границы изображения хотя бы один раз, но если вы хотите, чтобы они касались ее с обеих сторон, у вас слишком много циклов по пикселям маски, найдите пиксели с минимальным, максимальным значением x (если касаться левого и правого границ), и если некоторые из них не равны 0, ширина-1 каким-то образом соединяет соответствующие точки с границей (тонкой линией?). И, конечно же, вам нужно перебрать все сегменты, которые вы называете roi (в приведенном ниже коде я просто выбираю нижнюю половину для работы с нижним сегментом):
Mat I = imread("roi.jpg", 0);
imshow("input", I);
int h=I.rows;
int w=I.cols;
//select lower half of the mask
Rect rect(0, h/2, w, h/2);
Mat I2 = I(rect).clone();
int xmin=w, xmax=0;
int ymin, ymax;
for (int i=0; i<I2.rows; i++) {
uchar* imgrow = I2.ptr<uchar>(i);
for (int j=0; j<I2.cols; j++) {
if (xmin>j){
xmin=j;
ymin=i;
}
if (xmax<j) {
xmax=j;
ymax=i;
}
}
}
cout<<Point(xmin, ymin)<<", "<<Point(xmax, ymax)<<endl;
if (xmin>0) {
// connect
}
if (xmax<I2.cols) {
// connect
}
waitKey(-1);
Код выводит две точки: [24, 536], [1535, 409], причем первую нужно как-то связать с границей, так как у нее x!=0. Например, строка (I2, [24, 536], [0, 536], ...)
person
Vlad
schedule
23.03.2014