Поиск области контура в реальном времени с помощью OpenCV? - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь найти диаметр растущего круга в OpenCV. Я использую метод «Обнаружение формы + маска + контуры», чтобы определить форму по ее цвету (черный). Теперь я пытаюсь найти его радиус / диаметр по мере его роста. Моя первоначальная мысль заключалась в том, чтобы нарисовать прямоугольник вокруг найденного контура и найти его область, но по какой-то причине контур проявляется как несколько маленьких контуров, то есть на несколько прямоугольников больше, чем я думал.

(Исходный Видео: https://imgur.com/a/7lTnBUS)

(см. Результат: https://imgur.com/a/D8qHuB8)

Какой метод я могу подойти, чтобы представить этот найденный круг как один контур, что позволяет мне разместить один прямоугольник вокруг, а затем найти центр прямоугольника?

Заранее спасибо! :)

import cv2
import numpy as np


def nothing(x):
    pass


cap = cv2.VideoCapture("Dilation.mp4")
#cap = cv2.VideoCapture(0)

cv2.namedWindow("Trackbar")
cv2.createTrackbar("L-H", "Trackbar", 0, 180, nothing)
cv2.createTrackbar("L-S", "Trackbar", 0, 255, nothing)
cv2.createTrackbar("L-V", "Trackbar", 0, 255, nothing)
cv2.createTrackbar("U-H", "Trackbar", 180, 180, nothing)
cv2.createTrackbar("U-S", "Trackbar", 255, 255, nothing)
cv2.createTrackbar("U-V", "Trackbar", 255, 255, nothing)

while True:

    _, frame = cap.read()

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    l_h = cv2.getTrackbarPos("L-H","Trackbar")
    l_s = cv2.getTrackbarPos("L-S", "Trackbar")
    l_v = cv2.getTrackbarPos("L-V", "Trackbar")
    u_h = cv2.getTrackbarPos("U-H", "Trackbar")
    u_s = cv2.getTrackbarPos("U-S", "Trackbar")
    u_v = cv2.getTrackbarPos("U-V", "Trackbar")


    #lower_black = np.array([l_h,l_s,l_v])
    #upper_black = np.array([u_h,u_s,u_v])

    #lower_black = np.array([12, 5, 0])
    #upper_black = np.array([103, 255, 215])

    lower_black = np.array([47, 123, 28]) #initial thin line
    upper_black = np.array([180,255,255]) #initial thin line

    mask = cv2.inRange(hsv, lower_black, upper_black)
    #kernel = np.ones((5,5), np.uint8) #remove for initial thin line
    #mask = cv2.erode(mask,kernel) #remove for initial thin line
    #Contours

    contours, heirarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    for cnt in contours:
        approx = cv2.approxPolyDP(cnt,0.01 * cv2.arcLength (cnt, True), True)
        cv2.drawContours(frame,[approx],0,(0,255,0), 5)




        #print(len(approx))


        (x, y, w, h) = cv2.boundingRect(cnt)
        perimeter = cv2.arcLength(cnt,True)
        epsilon = 0.1 * cv2.arcLength(cnt, True)
        approx = cv2.approxPolyDP(cnt, epsilon, True)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
        rect = cv2.minAreaRect(cnt)
        box = cv2.boxPoints(rect)
        box = np.int0(box)
        cv2.drawContours(frame, [box], 0, (0, 0, 255), 2)

        print(approx)



    cv2.imshow("Frame", frame)
    cv2.imshow("Mask", mask)

    key = cv2.waitKey(1)
    if key == 27:
        break



print(area)

cap.release()
cv2.destroyAllWindows()
...