在 OpenCV 中绘制有角度的矩形
Posted
技术标签:
【中文标题】在 OpenCV 中绘制有角度的矩形【英文标题】:Drawing angled rectangles in OpenCV 【发布时间】:2016-08-23 14:32:58 【问题描述】:我正在使用 OpenCV 和 python 来处理一个涉及身体跟踪的项目,我正在使用 HSV 值来查找肤色,然后在它周围画一个框。
但是,尽管我可以找到被跟踪的对象并在其周围画一个框,但矩形始终是垂直的,我想知道矩形是否有任何角度,以便它们更好地显示检测到的对象,有点像 minEnclosureCircle 函数,但使用矩形
这些图片可能更好地解释了我在寻找什么。我得到的盒子是绿色的,我正在寻找的东西是黄色的。如您所见,蒙版显示和有角度的矩形也将更好地包含所选区域。我还包括了原始图像。
我的代码是:
import numpy as np
import cv2
# Input image
image = cv2.imread('TestIn.png')
# Converts to grey for better reulsts
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Converts to HSV
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# HSV values
lower_skin = np.array([5,36,53])
upper_skin = np.array([19,120,125])
mask = cv2.inRange(hsv, lower_skin, upper_skin)
mask = cv2.erode(mask, None, iterations=2)
mask = cv2.dilate(mask, None, iterations=2)
# Finds contours
im2, cnts, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# Draws contours
for c in cnts:
if cv2.contourArea(c) < 3000:
continue
(x, y, w, h) = cv2.boundingRect(c)
cv2.rectangle(image, (x,y), (x+w,y+h), (0, 255, 0), 2)
cv2.imshow('mask', mask)
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
输入图片:
输出图像(绿色为输出框,黄色为所需框):
【问题讨论】:
minAreaRect 函数计算你想要的。但是必须手动画线,RotatedRect对象没有画线功能 请参阅文档中official OpenCV tutorial 中的第 7 节。 【参考方案1】:您需要先使用cv2.minAreaRect(...)
,然后使用cv2.boxPoints(...)
,以获取表示多边形的点序列,其格式可以被其他OpenCV绘图函数使用,例如cv2.drawContours(...)
或cv2.polylines(...)
。
基于 OpenCV 文档中的 example,我在您的代码中添加了一些语句以达到预期的结果:
import numpy as np
import cv2
# Input image
image = cv2.imread('oaHUs.jpg')
# Converts to grey for better reulsts
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Converts to HSV
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# HSV values
lower_skin = np.array([5,36,53])
upper_skin = np.array([19,120,125])
mask = cv2.inRange(hsv, lower_skin, upper_skin)
mask = cv2.erode(mask, None, iterations=2)
mask = cv2.dilate(mask, None, iterations=2)
# Finds contours
im2, cnts, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# Draws contours
for c in cnts:
if cv2.contourArea(c) < 3000:
continue
(x, y, w, h) = cv2.boundingRect(c)
cv2.rectangle(image, (x,y), (x+w,y+h), (0, 255, 0), 2)
## BEGIN - draw rotated rectangle
rect = cv2.minAreaRect(c)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(image,[box],0,(0,191,255),2)
## END - draw rotated rectangle
cv2.imwrite('out.png', image)
输出:
【讨论】:
没问题。如果它解决了您的问题,请随时接受答案。 太棒了!谢谢:)以上是关于在 OpenCV 中绘制有角度的矩形的主要内容,如果未能解决你的问题,请参考以下文章