2016-04-28 4 views
3

Я использую OpenCV и python для работы над проектом, который включает в себя отслеживание тела, и я использую значения HSV, чтобы найти оттенок кожи, затем нарисуйте вокруг него коробку.Рисование угловых прямоугольников в OpenCV

Однако, хотя я могу найти отслеживаемый объект и нарисовать прямоугольник вокруг него, прямоугольники всегда вертикальны, и я хотел бы знать, есть ли какой-либо угол углов, чтобы они лучше отображали обнаруженный объект, несколько похожий на функцию minEnclosingCircle , но с использованием прямоугольника

Изображения, вероятно, объясняют, что я ищу лучше. Ящики, которые я получаю, зеленые, и то, что я ищу, я нарисовал желтым цветом. Как вы можете видеть, маска показывает, и прямоугольник с прямоугольником также будет лучше охватывать выбранную область. Я также включил исходный образ.

Мой код:

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() 

Входное изображение:

Input Image

выходного изображения (выходные коробки в зеленые, необходимые окошки в желтый цвет):

output image. output boxes in green, desired boxes in yellow

+1

функция minAreaRect вычисляет то, что вы хотите , но вы должны рисовать линии вручную, нет функции рисования для объектов RotatedRect. – Micka

+0

См. раздел 7 в этом [официальном учебнике OpenCV] (http://docs.opencv.org/3.1.0/dd/d49/tutorial_py_contour_features.html # gsc.tab = 0) из документации. –

ответ

3

Вам необходимо использовать cv2.minAreaRect(...), а затем cv2.boxPoints(...), чтобы получить последовательность точек, представляющих многоугольник, в формате, который может использоваться другими функциями рисования OpenCV, такими как cv2.drawContours(...) или cv2.polylines(...).


Основываясь на example в 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) 

Выход:

+0

Thats perfect, большое спасибо за помощь – Stump

+0

Нет проблем. Не стесняйтесь принять ответ, если он решит вашу проблему. –

Смежные вопросы