Python 在OpenCV中绘制有角度的矩形

Python 在OpenCV中绘制有角度的矩形,python,opencv,tracking,Python,Opencv,Tracking,我正在使用OpenCV和python来处理一个涉及身体跟踪的项目,我正在使用HSV值来查找肤色,然后在其周围绘制一个方框 然而,尽管我可以找到被跟踪的对象并在其周围绘制一个方框,但矩形始终是垂直的,我想知道是否存在角度矩形,以便它们更好地显示检测到的对象,有点像MineConclosingCircle函数,但使用矩形 这些图片可能更好地解释了我在寻找什么。我得到的盒子是绿色的,我要找的是黄色的。如您所见,遮罩显示和成角度的矩形也会更好地包围选定区域。我还包括了原始图像 我的代码是: 将numpy

我正在使用OpenCV和python来处理一个涉及身体跟踪的项目,我正在使用HSV值来查找肤色,然后在其周围绘制一个方框

然而,尽管我可以找到被跟踪的对象并在其周围绘制一个方框,但矩形始终是垂直的,我想知道是否存在角度矩形,以便它们更好地显示检测到的对象,有点像MineConclosingCircle函数,但使用矩形

这些图片可能更好地解释了我在寻找什么。我得到的盒子是绿色的,我要找的是黄色的。如您所见,遮罩显示和成角度的矩形也会更好地包围选定区域。我还包括了原始图像

我的代码是:

将numpy导入为np
进口cv2
#输入图像
image=cv2.imread('TestIn.png')
#转换为灰色以获得更好的效果
灰色=cv2.CVT颜色(图像,cv2.COLOR\u BGR2GRAY)
#转换为HSV
hsv=cv2.cvt颜色(图像,cv2.COLOR\u BGR2HSV)
#HSV值
下表皮=np.数组([5,36,53])
上表皮=np.数组([19120125])
面罩=cv2.inRange(hsv、下皮肤、上皮肤)
掩模=cv2。腐蚀(掩模,无,迭代次数=2)
掩码=cv2。放大(掩码,无,迭代次数=2)
#寻找轮廓
im2,cnts,hierarchy=cv2.findContours(mask.copy(),cv2.RETR_树,cv2.CHAIN_近似_简单)
#画轮廓
对于碳纳米管中的碳:
如果cv2.轮廓面积(c)<3000:
持续
(x,y,w,h)=cv2.boundingRect(c)
cv2.矩形(图像,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow(“面具”,面具)
cv2.imshow(“图像”,图像)
cv2.等待键(0)
cv2.destroyAllWindows()
输入图像:

输出图像(输出框为绿色,所需框为黄色):

您需要使用和,然后以其他OpenCV绘图功能(如或)可以使用的格式获取表示多边形的点序列


基于OpenCV文档中的内容,我在代码中添加了一些语句以实现所需的结果:

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)
将numpy导入为np
进口cv2
#输入图像
image=cv2.imread('oaHUs.jpg')
#转换为灰色以获得更好的效果
灰色=cv2.CVT颜色(图像,cv2.COLOR\u BGR2GRAY)
#转换为HSV
hsv=cv2.cvt颜色(图像,cv2.COLOR\u BGR2HSV)
#HSV值
下表皮=np.数组([5,36,53])
上表皮=np.数组([19120125])
面罩=cv2.inRange(hsv、下皮肤、上皮肤)
掩模=cv2。腐蚀(掩模,无,迭代次数=2)
掩码=cv2。放大(掩码,无,迭代次数=2)
#寻找轮廓
im2,cnts,hierarchy=cv2.findContours(mask.copy(),cv2.RETR_树,cv2.CHAIN_近似_简单)
#画轮廓
对于碳纳米管中的碳:
如果cv2.轮廓面积(c)<3000:
持续
(x,y,w,h)=cv2.boundingRect(c)
cv2.矩形(图像,(x,y),(x+w,y+h),(0,255,0),2)
##开始-绘制旋转矩形
rect=cv2.minareact(c)
长方体=cv2.长方体点(矩形)
box=np.int0(box)
cv2.等高线图(图[box],0,(0191255),2)
##结束-绘制旋转矩形
cv2.imwrite('out.png',图像)
输出:


minareact函数计算您想要的内容。但是您必须手动绘制线条,RotatedRect对象没有绘图功能。请参阅文档中的第7节。没问题。如果答案解决了你的问题,请随意接受。太棒了!谢谢:)