如何找到联合矩形的轮廓

时间:2018-09-06 02:21:28

标签: python opencv

我有每个矩形的坐标,想找到并集矩形的轮廓。 rectangles

outline of rectangles

所以我要做的就是用坐标绘制并绘制所有矩形的颜色。 并找到所有矩形的轮廓。 colored rectangles

但是我想知道是否有某种算法 仅使用坐标信息做同样的事情。 这样我就不需要绘制和着色整个矩形。 (有超过4000个矩形,因此计算量很大)

2 个答案:

答案 0 :(得分:0)

使用轮廓检测​​可以实现您想要的。为此,您应该对OpenCV中使用的轮廓层次样式有很好的了解。有几种轮廓检索模式。例如cv2.RETR_LISTcv2.RETR_TREEcv2.RETR_CCOMPcv2.RETR_EXTERNAL。您可以检查documentation了解更多信息。

在您的情况下,应使用cv2.RETR_EXTERNAL来检索图像的外部轮廓。

这是解决方案代码:

import cv2
im = cv2.imread('test.png')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
cv2.bitwise_not(imgray,imgray)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cv2.drawContours(im, contours, -1, (0,255,0), 3)
cv2.imshow("image", im)
cv2.waitKey(0)

输出:

答案 1 :(得分:0)

findContours是您要寻找的功能。下面的代码说明了它的工作原理。

import cv2
import numpy as np
import matplotlib.pyplot as plt


img = cv2.imread("./outline_rect.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
thresh = 255-thresh
_, cnts, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)


maxArea = 0
best = None
for contour in cnts:
  area = cv2.contourArea(contour)
  if area > maxArea :
    maxArea = area
    best = contour

cv2.drawContours(img, [best], 0, (0, 0, 255), 3)

while True:
  cv2.imshow("result", img)
  k = cv2.waitKey(30) & 0xff
  if k == 27:
      break

结果: result of the code