2016-03-19 6 views
1

У меня есть различные пересекающиеся прямоугольники, которые нарисованы на изображении, как это:Как совместить перекрывающиеся прямоугольники в Python

enter image description here

Я хотел бы объединить эти прямоугольники таким образом, что только берутся внешние большинство прямоугольников. Например, один прямоугольник для computer.org/webinars/Agile2 и один для FREE WEBINAR и т.д.

Как я рисую прямоугольники это:

import cv2 
import numpy as np 
..... 
for rect in rects_new: 
    #print (str(type(rect))) #<class 'numpy.ndarray'> 
    #print (rect.area()) # gives error that 'numpy.ndarray' object has no attribute 'area' 
    cv2.rectangle(vis, (rect[0],rect[1]), (rect[0]+rect[2],rect[1]+rect[3]), (0, 255, 255), 2) 

Я наткнулся на этот ответ https://stackoverflow.com/a/24061475/44286 и этот ответ http://answers.opencv.org/question/67091/how-to-find-if-2-rectangles-are-overlapping-each-other/?answer=67092#post-id-67092, что наводит на мысль OpenCV обеспечивает пересечение из двух прямоугольников с &. Однако я не могу это сделать в python. Когда я вызываю метод area, я получаю сообщение об ошибке (как показано в приведенном выше фрагменте).

Вопрос

Как я могу объединить прямоугольники таким образом, что, когда прямоугольники накладываются друг на друга, то только внешний самый прямоугольник берется. Я хотел бы решить его в python, используя OpenCVs, предоставленный прямоугольник, пересекающий &. Как упоминалось в этой документации http://docs.opencv.org/3.1.0/d2/d44/classcv_1_1Rect__.html#gsc.tab=0, а также упоминается в связанном ответе, опубликованном выше.

+0

Что делать, если вы 'cv.fromarray (Rect) .area()'? – Boud

+0

@Boud 'AttributeError: module 'cv2' не имеет атрибута 'fromarray'' – Anthony

+0

@Boud У меня нет ничего, что является' cv' в моем коде. Я пробовал делать 'np.fromarray', но получил ошибку' module 'numpy' не имеет атрибута 'fromarray''. Поскольку у меня нет ничего, что определено как 'cv', когда я делаю' cv.fromarray', я получаю ошибку 'name 'cv' не определен'. Я обновил вопрос с помощью моего импорта – Anthony

ответ

0

Это может работать:

def inOtherRect(rect_inner,rect_outer): 
    return rect_inner[0]>=rect_outer[0] and \ 
     rect_inner[0]+rect_inner[2]<=rect_outer[0]+rect_outer[2] and \ 
     rect_inner[1]>=rect_outer[1] and \ 
     rect_inner[1]+rect_inner[3]<=rect_outer[1]+rect_outer[3] and \ 
     (rect_inner!=rect_outer) 

outer_rects=[rects_new[:]] 
for rect_inner in rects_new: 
    for rect_outer in rects_new: 
     if(inOtherRect(rect_inner,rect_outer)): 
      if rect_inner in outer_rects: 
       outer_rects.remove(rect_inner) 


for rect in outer_rects: 
    #print (str(type(rect))) #<class 'numpy.ndarray'> 
    #print (rect.area()) # gives error that 'numpy.ndarray' object has no attribute 'area' 
    cv2.rectangle(vis, (rect[0],rect[1]), (rect[0]+rect[2],rect[1]+rect[3]), (0, 255, 255), 2) 

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

Это делается крайне неэффективен и уродлив, но он должен работать (если я правильно понял вашу систему координат).

Примечание:

Это только удаляет rectanlges, которые находятся внутри другой, но не частично перекрывающихся те

+0

Спасибо, я попробую. Однако я специально использовал функцию '&' intersect, предоставляемую в OpenCV. В этой документации упоминается, что '&' можно использовать для определения того, пересекаются ли два прямоугольника: http://docs.opencv.org/3.1.0/d2/d44/classcv_1_1Rect__.html#gsc.tab=0 – Anthony