python - 定义面具将在其中起作用的视频区域
问题描述
我有一个脚本,根据蒙版检测屏幕上的一些对象,但是我有一个感兴趣的区域,或者我只想在视频的某个区域应用蒙版,这是一个示例图像:
下面是我的脚本:
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()
解决方案
算法的分割/检测部分似乎与特定的图像大小无关。因此,您可以做的是使用感兴趣区域来选择图像中感兴趣的部分,然后在此 ROI 上运行算法并将结果合并回来(可以这样做,因为您知道 ROI 的位置) .
为了提取 ROI,您可以使用简单的索引:
roi = image[ystart:yend][xstart:xend]
现在,您可以roi
用作任何图像。您在其上运行算法,然后image
使用简单的分配更改相应的部分:
image[ystart:yend][xstart:xend] = processedROI
推荐阅读
- sql-server - 使用 pivot 子句时用 0 替换 NULL
- html - 阻止 Blazor WebAssembly 在按 Enter 时提交表单
- c++ - 表示动态类成员变量类型的最佳方法?
- sql - 使用 R DBI 包获取 SQL 表的完整“路径”
- python - 如果文件夹不存在,则引发异常 pathlib python
- html - Placing an Image inside another png/svg file
- python-3.x - Open3D 点云的 Draco 压缩
- c# - 在 WPF 中获取 Windows 10 文本缩放值
- flutter - 我在颤振应用程序中显示来自 API 的数据时遇到问题
- favicon - 小书签的自定义图标