首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCV Python:绘制minAreaRect (未实现RotatedRect )

OpenCV Python:绘制minAreaRect (未实现RotatedRect )
EN

Stack Overflow用户
提问于 2013-08-13 18:52:22
回答 5查看 68.9K关注 0票数 45

有没有什么帮助器方法来绘制一个旋转的矩形,这个矩形大概是由cv2.minAreaRect()返回的,比如((x1,y1),(x2,y2),angle)cv2.rectangle()不支持角度。由于返回的元组不属于"RotatedRect“类(因为它似乎不是在Python绑定中实现的),因此没有points()方法,如C++教程"Creating Bounding rotated boxes and ellipses for contours¶"中所示。

如何从直线绘制旋转的矩形-围绕中心点或给定的第一个点旋转?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-08-13 19:35:25

代码语言:javascript
运行
复制
rect = cv2.minAreaRect(cnt)
box = cv2.cv.BoxPoints(rect) # cv2.boxPoints(rect) for OpenCV 3.x
box = np.int0(box)
cv2.drawContours(im,[box],0,(0,0,255),2)

应该能行得通。

资料来源:

1) http://opencvpython.blogspot.in/2012/06/contours-2-brotherhood.html

2) Python OpenCV Box2D

票数 74
EN

Stack Overflow用户

发布于 2020-01-29 11:19:42

下面是一个绘制旋转矩形的具体示例。其思想是使用Otsu's threshold获取二进制图像,然后使用cv2.findContours()查找轮廓。我们可以使用cv2.minAreaRect()获得旋转的矩形,使用cv2.boxPoints()获得四个角点。要绘制矩形,可以使用cv2.drawContours()cv2.polylines()

输入->输出

代码

代码语言:javascript
运行
复制
import cv2
import numpy as np

# Load image, convert to grayscale, Otsu's threshold for binary image
image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Find contours, find rotated rectangle, obtain four verticies, and draw 
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
rect = cv2.minAreaRect(cnts[0])
box = np.int0(cv2.boxPoints(rect))
cv2.drawContours(image, [box], 0, (36,255,12), 3) # OR
# cv2.polylines(image, [box], True, (36,255,12), 3)

cv2.imshow('image', image)
cv2.waitKey()
票数 5
EN

Stack Overflow用户

发布于 2019-10-23 14:12:04

我知道这在很久以前就被问到了,但是我想分享一种不同于公认答案所提出的方法,也许这可以对其他人有所帮助(实际上在C++中已经这样做了,但是似乎python仍然缺乏RotatedRect类)。

这个想法是从一个角度,一个尺寸(W和H)和一个初始点定义一个旋转的矩形。此初始点是相对左上角(没有旋转角度的相同大小矩形的左上角)。从这里,可以获得四个顶点,这允许我们绘制具有四条线的旋转矩形。

代码语言:javascript
运行
复制
class RRect:
  def __init__(self, p0, s, ang):
    self.p0 = (int(p0[0]),int(p0[1]))
    (self.W, self.H) = s
    self.ang = ang
    self.p1,self.p2,self.p3 = self.get_verts(p0,s[0],s[1],ang)
    self.verts = [self.p0,self.p1,self.p2,self.p3]

  def get_verts(self, p0, W, H, ang):
    sin = numpy.sin(ang/180*3.14159)
    cos = numpy.cos(ang/180*3.14159)
    P1 = (int(self.H*sin)+p0[0],int(self.H*cos)+p0[1])
    P2 = (int(self.W*cos)+P1[0],int(-self.W*sin)+P1[1])
    P3 = (int(self.W*cos)+p0[0],int(-self.W*sin)+p0[1])
    return [P1,P2,P3]

  def draw(self, image):
    print(self.verts)
    for i in range(len(self.verts)-1):
      cv2.line(image, (self.verts[i][0], self.verts[i][1]), (self.verts[i+1][0],self.verts[i+1][1]), (0,255,0), 2)
    cv2.line(image, (self.verts[3][0], self.verts[3][1]), (self.verts[0][0], self.verts[0][1]), (0,255,0), 2)

(W, H) = (30,60)
ang = 35 #degrees
P0 = (50,50)
rr = RRect(P0,(W,H),ang)
rr.draw(image)
cv2.imshow("Text Detection", image)
cv2.waitKey(200)

我猜,可以使用类似的方法来定义旋转矩形的中心,而不是其相对左上角的初始点,但我还没有尝试过。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18207181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档