我在图像上绘制了各种重叠的矩形,如下所示:
我想巩固这些矩形,以便只拍摄最外面的矩形。例如,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
方法时出现错误(如上面的代码段所示)。
问题
如何合并矩形,以便在矩形重叠时,只拍摄最外面的矩形。我想通过使用OpenCVs提供的矩形交叉&
功能在python中解决它。正如本文档中提到的http://docs.opencv.org/3.1.0/d2/d44/classcv_1_1Rect__.html#gsc.tab=0以及上面发布的链接答案中也提到过。
答案 0 :(得分: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)
我遍历所有矩形并从复制列表中删除其他矩形内的那些矩形。
这是完成非常无效和丑陋,但它应该有效(如果我猜对齐你的坐标系)。
注意:
这只删除了另一个但不是部分重叠的矩形