Как найти контуры только коричневых областей на изображении? - PullRequest
0 голосов
/ 17 января 2020

Я пытался найти контуры коричневых областей на моей раме.

frame

Я пытался найти эти контуры в for l oop.

    for c in cntrs:
        area = cv2.contourArea(c)
        if area > 1200:   # i obtanied threshold with trial end error
            x, y, w, h = cv2.boundingRect(c) #find coordinates of brown area
            roi2 = results[y:y + h, x:x + w] #copy these parts to the another image

но я вижу только один контур как результат

result

я не мог понять, почему я вижу только один контур , потому что когда я печатаю количество пороговых контуров, я вижу 2

вот что я попробовал

import cv2
import numpy as np
cv2.destroyAllWindows()
capture = cv2.VideoCapture(0) ##masaustunde 1, laptopta 0


def nothing(x):
    pass

roi = cv2.imread('savedImage.jpg')
cv2.imshow('input', roi)
hsv = cv2.cvtColor(roi, cv2.COLOR_RGB2HSV)

lower_green = np.array([0, 0, 0])
upper_green = np.array([40, 255, 255])

mask = cv2.inRange(hsv, lower_green, upper_green)
mask_inv = cv2.bitwise_not(mask)

fg = cv2.bitwise_and(roi, roi, mask=mask_inv)

gray = cv2.cvtColor(fg, cv2.COLOR_BGR2GRAY)
gray = cv2.cvtColor(fg, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 32, 255, 0)[1]
cntrs = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cntrs = cntrs[0] if len(cntrs) == 2 else cntrs[1]
area_thresh = 0
syc = 0
results = fg.copy()
for c in cntrs:
    area = cv2.contourArea(c)
    if area > 1200: #esige dikkat
        syc = syc + 1
        x, y, w, h = cv2.boundingRect(c)
        roi2 = results[y:y + h, x:x + w]
cv2.imshow('roi2', roi2)

cv2.waitKey(0)


capture.release()  # release the camera from video capture
cv2.destroyAllWindows()

1 Ответ

0 голосов
/ 18 января 2020

Вы пишете результаты (roi2) в вашем l oop, не дожидаясь просмотра каждого из них. Вы должны поместить waitKey () в l oop.

Также, как я уже говорил, порог вашей области был слишком высок.

Я также выбрал лучший нижний и верхний пороги. (Я сохраняю файл hsv и затем измеряю его значения в инструменте GUI)

Это работает для меня в Python / OpenCV. Нажмите клавишу возврата после каждого roi2, чтобы отобразить go для следующего.

import cv2
import numpy as np

roi = cv2.imread('green_areas.jpg')
#cv2.imshow('input', roi)

hsv = cv2.cvtColor(roi, cv2.COLOR_RGB2HSV)
#cv2.imshow('hsv', hsv)

lower_green = np.array([30, 30, 30])
upper_green = np.array([60, 140, 100])

mask = cv2.inRange(hsv, lower_green, upper_green)
#cv2.imshow('mask', mask)

mask_inv = cv2.bitwise_not(mask)

fg = cv2.bitwise_and(roi, roi, mask=mask_inv)
#cv2.imshow('fg', fg)

gray = cv2.cvtColor(fg, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 32, 255, 0)[1]
#cv2.imshow('thresh', thresh)

cntrs = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cntrs = cntrs[0] if len(cntrs) == 2 else cntrs[1]
area_thresh = 0
syc = 0
results = fg.copy()
for c in cntrs:
    area = cv2.contourArea(c)
    if area > 500: #esige dikkat
        syc = syc + 1
        x, y, w, h = cv2.boundingRect(c)
        roi2 = results[y:y + h, x:x + w]
        cv2.imshow('roi2', roi2)
        cv2.waitKey(0)

cv2.destroyAllWindows()
...