Определите область видео, в которой будет действовать маска - PullRequest
0 голосов
/ 03 июля 2019

У меня есть скрипт, который в соответствии с маской обнаруживает некоторые объекты на экране, однако у меня есть область интереса, или я хочу применить маску только в определенной области видео, вот примерimage:

enter image description here

И ниже мой сценарий:

import cv2
import numpy as np
#Python + Open CV - Detecção de Fogo - Script Desenvolvido por Matheus Arruda
#0 -> busca o video da webcam // "nome_do_arquivo.mp4" faz a detecção com base em um video
video = cv2.VideoCapture("video.mp4")

while True:
    (grabbed, frame) = video.read()
    if not grabbed:
        break
    #filtro de exibição (blur)
    blur = cv2.GaussianBlur(frame, (5, 5), 0)
    #Metodo de detecção de cor (pode ser usado HSV ou RGB) RGB se utiliza o metodo padrão de cor, exemplo: Vermelho 255,0,0
    hsv = cv2.cvtColor(blur, cv2.COLOR_BGR2HSV)
    #Parametros de detecção de cor 
    minimo = [18, 70, 50]#[18, 50, 50]
    maximo = [35, 255, 255] #[35, 255, 255]
    minimo = np.array(minimo, dtype="uint8")
    maximo = np.array(maximo, dtype="uint8")
    #Na mascara, seto o tipo de filtro que nesse caso é o HSV e os ranges de detecção minimo e máximo
    mascara = cv2.inRange(hsv, minimo, maximo)
    #Desenho o contorno dos objetos detectados
    _, contours, _ = cv2.findContours(mascara, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
    for contour in contours:
        cv2.drawContours(frame, contour, -1, (0, 255, 0), 3)


    #Saida, frame = video, aplicado HSV e a mascara definida acima
    output = cv2.bitwise_and(frame, hsv, mask=mascara)
    #Conta a quantidade de pixels que não estão com vermelho, com base nessa informação geramos a condição de detectação de fogo
    px_sem_vermelho = cv2.countNonZero(mascara)
    font = cv2.FONT_HERSHEY_SIMPLEX
    if int(px_sem_vermelho) > 1500: #Padrão de detecção (20.000)
        print ('Detectado Fogo')
        cv2.putText(frame,'Vazando Ferro Liquido',(10,330), font, 0.7,(255,255,255),2,cv2.LINE_AA)
        print(px_sem_vermelho)
    elif int(px_sem_vermelho) > 900:
        print('Sem Fogo')
        cv2.putText(frame,'Vazando Pouco Ferro Liquido',(10,330), font, 0.7,(255,255,255),2,cv2.LINE_AA)
        print(int(px_sem_vermelho))
    else:
        print('Sem Fogo')       
        print(int(px_sem_vermelho))

    cv2.imshow("Filtro Deteccao", cv2.resize(output,(640,480)))
    cv2.imshow("Video", cv2.resize(frame,(640,480)))
    #print("output:", frame)

        #print("output:".format(mascara))
        #Tecla 'q' definida para sair do programa
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()
video.release()

1 Ответ

0 голосов
/ 05 июля 2019

Кажется, что часть алгоритма сегментации / обнаружения не привязана к конкретным размерам изображения. Поэтому, что вы можете сделать, это использовать область интереса, чтобы выбрать интересную часть изображения, затем запустить алгоритм для этой области интереса и объединить результаты обратно (что можно сделать, поскольку вы знаете местоположение области интереса). .

Чтобы извлечь ROI, вы можете использовать простую индексацию:

roi = image[ystart:yend][xstart:xend]

Теперь вы можете использовать roi в качестве любого изображения. Вы запускаете алгоритм на нем, а затем изменяете соответствующую деталь в image, используя простое назначение:

image[ystart:yend][xstart:xend] = processedROI
...