簡體   English   中英

從輪廓中查找旋轉的矩形

[英]Finding rotated rectangle from contour

我正在嘗試使用OpenCV從圖像中識別並提取一個相當明顯的區域。 到目前為止,通過使用閾值和一系列擴張和糜爛,我可以成功找到我需要的區域的輪廓。

但是,我嘗試使用minAreaRect作為旋轉和裁剪的前體無法生成包含輸入輪廓的矩形。

contours, hierarchy = cv2.findContours(morph.copy() ,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contour = contours[0]

draw = cv2.cvtColor(morph, cv2.COLOR_GRAY2BGR)
cv2.drawContours(draw, [contour], 0, (0,255,0), 2)

rotrect = cv2.minAreaRect(contour)
box = cv2.cv.BoxPoints(rotrect)
box = numpy.int0(box)
cv2.drawContours(draw, [box], 0, (0,0,255), 2)

cv2.imshow('image', draw); cv2.waitKey(0)

這是輸出的例子:

產量

紅色筆划是rect ,綠色是contour 我原以為紅色筆畫會包含綠色筆畫。

不幸的是我無法提供輸入圖像。

我最終通過實現自己的旋轉卡尺程序來找到最小矩形來解決這個問題。 它使用凸包來確定候選旋轉。

def p2abs(point):
    return math.sqrt(point[0] ** 2 + point[1] ** 2)

def rotatePoint(point, angle):
    s, c = math.sin(angle), math.cos(angle)
    return (p[0] * c - p[1] * s, p[0] * s + p[1] * c)

def rotatePoints(points, angle):
    return [rotatePoint(point, angle) for point in points]

points = map(lambda x: tuple(x[0]), contour)
convexHull = map(lambda x: points[x], scipy.spatial.ConvexHull(numpy.array(points)).vertices)

minArea = float("inf")
minRect = None

for i in range(len(hull)):
    a, b = convexHull[i], convexHull[i - 1]
    ang = math.atan2(b[0] - a[0], b[1] - a[1])

    rotatedHull = rotatePoints(convexHull, ang)

    minX = min(map(lambda p: p[0], rotatedHull))
    maxX = max(map(lambda p: p[0], rotatedHull))
    minY = min(map(lambda p: p[1], rotatedHull))
    maxY = max(map(lambda p: p[1], rotatedHull))

    area = (maxX - minX) * (maxY - minY)

    if area < minArea:
        minArea = area

        rotatedRect = [(minX, minY), (minX, maxY), (maxX, maxY), (maxX, minY)]
        minRect = rotatePoints(rotatedRect, -ang)

_, topLeft = min([(p2abs(p), i) for p, i in zip(range(4), minRect)])
rect = minrect[topLeft:] + minrect[:topLeft]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM