tybik 0 Жалоба Опубликовано October 29, 2010 В open cv есть функции чтбы определить пересекаются ли 2 Rect между собой и потом их объединить ? напимер так: Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано October 29, 2010 Не видел. Но вообще, сделать это просто. Если проекции двух прямоугольников на горизонтальную ось и на вертикальную накладываются друг на друга, то прямоугольники пересекаются. Проекция прямоугольника на горизонтальную ось есть (rect.x, rect.x + rect.width). Надо лишь написать маленькую функцию по проверке наложения этих проекция - всего несколько условий. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
tybik 0 Жалоба Опубликовано November 2, 2010 Написал. может кому понадобиться. 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++; } } } } } елси у кого появтьися идеи по улучшению.. буду рад советам Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах