Рисование контуров в opencv - PullRequest
0 голосов
/ 27 апреля 2020

Пытаюсь нарисовать контуры на изображении, только когда оно удовлетворяет условиям ниже,
1) Если координата X контура меньше или равна 600
2) Если координата Y контура равна меньше или равно 240
3) Если площадь контура больше или равна 900
Но я вижу, что вывод не удовлетворяет этим условиям ВСЕ *
(даже добавлен код для рисования линии, она также не отображается)
enter image description here

Исходный код :

import os
import re
import cv2 # opencv library
import numpy as np
from os.path import isfile, join
import matplotlib.pyplot as plt


# get file names of the frames
col_frames = os.listdir('persons/')

# sort file names
col_frames.sort(key=lambda f: int(re.sub(r'\D', '', f)))

# empty list to store the frames
col_images=[]

for i in col_frames:
    # read the frames
    img = cv2.imread('persons/'+i)
    # append the frames to the list
    col_images.append(img)

# Taking 66th frame
i = 66

# convert the frames to grayscale
grayA = cv2.cvtColor(col_images[i], cv2.COLOR_BGR2GRAY)
grayB = cv2.cvtColor(col_images[i+1], cv2.COLOR_BGR2GRAY)


diff_image = cv2.absdiff(grayB, grayA)
cv2.GaussianBlur(diff_image, (5,5), 0)

# perform image thresholding
ret, thresh = cv2.threshold(diff_image, 30, 255, cv2.THRESH_BINARY)

# apply image dilation
kernel = np.ones((20,20),np.uint8)
dilated = cv2.dilate(thresh,kernel,iterations = 1)

contours,_ = cv2.findContours(dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

valid_cntrs = []

for i,cntr in enumerate(contours):
    x,y,w,h = cv2.boundingRect(cntr)
    print(cv2.contourArea(cntr))
    if ((x <= 600) & (y <= 240)) & (cv2.contourArea(cntr) >= 900):
        valid_cntrs.append(cntr)

#Count of Contours
print('length of contours',len(contours))
# count of discovered contours        
print('length of valid contours',len(valid_cntrs))

dmy = col_images[67].copy()

cv2.line(dmy, (0, 240),(800,240),(100, 255, 255))
cv2.drawContours(dmy, valid_cntrs, -1, (127,200,0), 2)
plt.imshow(dmy)
plt.show()



Выход :

49631.0                                                                                                                                                        
65.5                                                                                                                                                           
32.5                                                                                                                                                           
15.0                                                                                                                                                           
654.0                                                                                                                                                          
854.5                                                                                                                                                          
length of contours 6                                                                                                                                           
length of valid contours 1  
<Also the output image above>

1 Ответ

2 голосов
/ 27 апреля 2020

Судя по вашему изображению и выводу, оно действительно работает. Вы можете не знать, что координаты x и y ограничивающих прямоугольников являются верхним левым углом прямоугольника. Если вы хотите проверить контуры на основе их средней точки, замените часть проверки следующим кодом:

for i,cntr in enumerate(contours):
    x,y,w,h = cv2.boundingRect(cntr)
    mid_x = x + w / 2.0
    mid_y = y + h / 2.0
    print(cv2.contourArea(cntr))
    if ((mid_x <= 600) & (mid_y <= 240)) & (cv2.contourArea(cntr) >= 900):
        valid_cntrs.append(cntr)

Чтобы проверить правый нижний угол контура, используйте вместо этого:

for i,cntr in enumerate(contours):
    x,y,w,h = cv2.boundingRect(cntr)
    rb_x = x + w
    rb_y = y + h
    print(cv2.contourArea(cntr))
    if ((rb_x <= 600) & (rb_y <= 240)) & (cv2.contourArea(cntr) >= 900):
        valid_cntrs.append(cntr)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...