Перейти к содержимому
Compvision.ru
tybik

Rect

Recommended Posts

В open cv есть функции чтбы определить пересекаются ли 2 Rect между собой и потом их объединить ?

напимер так: post-803-1288342847_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не видел. Но вообще, сделать это просто.

Если проекции двух прямоугольников на горизонтальную ось и на вертикальную накладываются друг на друга, то прямоугольники пересекаются.

Проекция прямоугольника на горизонтальную ось есть (rect.x, rect.x + rect.width). Надо лишь написать маленькую функцию по проверке наложения этих проекция - всего несколько условий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Написал. может кому понадобиться.

CvRect rez_rect[1000];

int rez_count=0; - это результаты.. прямоуглоьики и кол-во прямоугольников

void big_rect(CvRect rects[1000], int count)

{

CvRect i_rect;

CvRect j_rect;

CvRect big_rect;

CvRect b;

rez_count=0;

int log_x=0;

int log_y=0;

int el=0;

// î÷èñòêà

for(int i=0;i<count;i++) {

rez_rect.x=0;

rez_rect.y=0;

rez_rect.height=0;

rez_rect.width=0;

}

Form1->Label2->Caption=IntToStr(count);

if (count==1){

rez_rect[0]=rects[0];

rez_count++;

log_x=0;log_y=0;

// continue;

}

else {

for (int i=0;i<count;i++) {

log_x=0;log_y=0;

big_rect=rects;

// ñðàâíèâàåì ñ äðóãèìè

for(int j=i+1;j<count;j++) {

el=0;

if ((big_rect.y<=rects[j].y)&&(big_rect.y+big_rect.height>=rects[j].y)) {log_y=1; big_rect.y<=rects[j].y ? b.y=big_rect.y : b.y=rects[j].y;

big_rect.y+big_rect.height>=rects[j].y+rects[j].height ? b.height=big_rect.y+big_rect.height-b.y : b.height=rects[j].y+rects[j].height-b.y;}

if ((big_rect.y<=rects[j].y+rects[j].height)&&(big_rect.y+big_rect.height>=rects[j].y+rects[j].height)) {log_y=1; big_rect.y<=rects[j].y ? b.y=big_rect.y : b.y=rects[j].y;

big_rect.y+big_rect.height>=rects[j].y+rects[j].height ? b.height=big_rect.y+big_rect.height-b.y : b.height=rects[j].y+rects[j].height-b.y;}

if ((big_rect.x<=rects[j].x)&&(big_rect.x+big_rect.width>=rects[j].x)) {log_x=1; big_rect.x<=rects[j].x ? b.x=big_rect.x : b.x=rects[j].x;

big_rect.x+big_rect.width>=rects[j].x+rects[j].width ? b.width=big_rect.x+big_rect.width-b.x : b.width=rects[j].x+rects[j].width-b.x;}

if ((big_rect.x<=rects[j].x+rects[j].width)&&(big_rect.x+big_rect.width>=rects[j].x+rects[j].width)) {log_x=1; big_rect.x<=rects[j].x ? b.x=big_rect.x : b.x=rects[j].x;

big_rect.x+big_rect.width>=rects[j].x+rects[j].width ? b.width=big_rect.x+big_rect.width-b.x : b.width=rects[j].x+rects[j].width-b.x;}

// åñëè åñòü ïåðåñå÷åíèÿ ïî x è y òî ñîçäàåì ðåêò

if ((log_x==1)&&(log_y==1)) {

big_rect=b;

log_x=0;log_y=0; el=0;

}

}

if (rez_count==0) {

rez_rect[rez_count]=big_rect;

rez_count++;

log_x=0;log_y=0;

}

else {

el=0;

for(int k=0;k<rez_count;k++) {

if ((rez_rect[k].y<=big_rect.y)&&(rez_rect[k].y+rez_rect[k].height>=big_rect.y)) {log_y=1;big_rect.y<=rez_rect[k].y ? b.y=big_rect.y : b.y=rez_rect[k].y;

big_rect.y+big_rect.height>=rez_rect[k].y+rez_rect[k].height ? b.height=big_rect.y+big_rect.height-b.y : b.height=rez_rect[k].y+rez_rect[k].height-b.y;}

if ((rez_rect[k].y<=big_rect.y+big_rect.height)&&(rez_rect[k].y+rez_rect[k].height>=big_rect.y+big_rect.height)) {log_y=1;big_rect.y<=rez_rect[k].y ? b.y=big_rect.y : b.y=rez_rect[k].y;

big_rect.y+big_rect.height>=rez_rect[k].y+rez_rect[k].height ? b.height=big_rect.y+big_rect.height-rez_rect[k].y : b.height=rez_rect[k].y+rez_rect[k].height-b.y;}

if ((rez_rect[k].x<=big_rect.x)&&(rez_rect[k].x+rez_rect[k].width>=big_rect.x)) {log_x=1;big_rect.x<=rez_rect[k].x ? b.x=big_rect.x : b.x=rez_rect[k].x;

big_rect.x+big_rect.width>=rez_rect[k].x+rez_rect[k].width ? b.width=big_rect.x+big_rect.width-b.x : b.width=rez_rect[k].x+rez_rect[k].width-b.x;}

if ((rez_rect[k].x<=big_rect.x+big_rect.width)&&(rez_rect[k].x+rez_rect[k].width>=big_rect.x+big_rect.width)) {log_x=1;big_rect.x<=rez_rect[k].x ? b.x=big_rect.x : b.x=rez_rect[k].x;

big_rect.x+big_rect.width>=rez_rect[k].x+rez_rect[k].width ? b.width=big_rect.x+big_rect.width-b.x : b.width=rez_rect[k].x+rez_rect[k].width-b.x;}

// åñëè åñòü ïåðåñå÷åíèÿ ïî x è y òî ñîçäàåì ðåêò

if ((log_x==1)&&(log_y==1)) {

rez_rect[k]=b;

log_x=0;log_y=0; el=1;

}

}

if (el==0) {

rez_rect[rez_count]=big_rect;

log_x=0;log_y=0; el=1;

rez_count++;

}

}

}

}

}

елси у кого появтьися идеи по улучшению.. буду рад советам

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×