AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Delphi-PRAXiS - Lounge Delphi-News aus aller Welt Detectar movimiento de personas en un área con Python4Delphi
Thema durchsuchen
Ansicht
Themen-Optionen

Detectar movimiento de personas en un área con Python4Delphi

Ein Thema von DP News-Robot · begonnen am 6. Jan 2022
Antwort Antwort
Benutzerbild von DP News-Robot
DP News-Robot

Registriert seit: 4. Jun 2010
15.472 Beiträge
 
#1

Detectar movimiento de personas en un área con Python4Delphi

  Alt 6. Jan 2022, 14:40




En esta ocasión veremos como detectar movimiento sobre un área utilizando Python4Delphi.

La versión de Delphi que he utilizado es la 10.4.2

Python4Delphi es un conjunto de componentes que encapsulan las funciones de las DLL de Python, lo que permite crear scripts de Python dentro de los programas realizados con Delphi.

Entre otras muchas cosas permite:

-Acceder a funciones de bajo nivel de Python.

-Utilizan comunicacion bidireccional con sus scripts.

-Acceder a objetos Python utilizando variants personalizados en Delphi.

-Construir wrappers de objetos Delphi para utilizarlos en scripts de Python,

-Crear módulos en Python utilizando las clases y funciones de Delphi.



Instalación de Python

Para que funcionen nuestras aplicaciones en Delphi hay que tener instalado Python en Windows, que lo pueden descargar desde su sitio oficial





Instalación de Python4Delphi

La forma mas sencilla es utilizar Getit

Abrimos nuestro Rad Studio y accedemos al menú

Project - Tools - Getit Package Manager

Escribimos Python4Delphi en la caja de búsqueda y pulsamos el botón INSTALL








Getit nos añade los componentes necesarios en nuestro entorno de desarrollo y modifica automáticamente nuestro Library Path:

Tools - Options - Language - Delphi - Library - (Win32 o Win64)


añadiendo la rutas de las dll de Python4Delphi.

Después de su instalación tienen multitud de programas Demo en la ruta:


C:\Users\\Documents\Embarcadero\Studio\22.0\Catalo gRepository\Python4Delphi-1.0\Demos\


Creación de nuestro primer programa


Abrimos el programa de ejemplo llamado Demo01 que está en la ruta:


C:\Users\\Documents\Embarcadero\Studio\22.0\Catalo gRepository\Python4Delphi-1.0\Demos\Demo01\Demo01.dpr





La ventana está dividida en 2 partes, en la parte superior muestra el resultado de la ejecución del programa o los errores que se produzcan y en la inferior es donde tenemos que escribir el código del script en python.

IMPORTANTE: Python tiene muchos módulos precargados que vienen con la instalación original, entre ellos hay uno llamado pip, que sirve para realizar la carga de módulos adicionales.

Para lo que queremos hacer en este ejemplo hay que abrir una ventana CMD y escribir lo siguiente:

c:\ pip install opencv-contrib-python (Con esto instalamos OpenCV, que es una biblioteca para el tratamiento de imágenes)


y después

c:\ pip install numpy

También hay añadir la siguiente línea en el componente PythonEngine1 del programa Demo01 (esto no viene en la demo original)


Método: OnBeforeLoad

Código: MaskFPUExceptions(True)

Tiene que quedar así:

procedure TForm1.PythonEngine1BeforeLoad(Sender: TObject);
begin
MaskFPUExceptions(True)
end;

Esto se hace para ocultar los errores de división por cero que suelen producirse al ejecutar opencv dentro de Delphi.


Ejecutamos el programa y en la ventana inferior escribimos el siguiente código:



import cv2
import numpy as np

cap = cv2.VideoCapture('c:/aeropuerto.mp4')

fgbg = cv2.bgsegm.createBackgroundSubtractorMOG()
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))

while True:

ret, frame = cap.read()
if ret == False: break

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

# Dibujamos un rectángulo en frame, para señalar el estado
# del área en análisis (movimiento detectado o no detectado)
cv2.rectangle(frame,(0,0),(frame.shape[1],40),(0,0,0),-1)
color = (0, 255, 0)
texto_estado = "Estado: No se ha detectado movimiento"

# Especificamos los puntos extremos del área a analizar
area_pts = np.array([[240,320], [480,320], [620,frame.shape[0]], [50,frame.shape[0]]])

# Con ayuda de una imagen auxiliar, determinamos el área
# sobre la cual actuará el detector de movimiento
imAux = np.zeros(shape=(frame.shape[:2]), dtype=np.uint8)
imAux = cv2.drawContours(imAux, [area_pts], -1, (255), -1)
image_area = cv2.bitwise_and(gray, gray, mask=imAux)

# Obtendremos la imagen binaria donde la región en blanco representa
# la existencia de movimiento
fgmask = fgbg.apply(image_area)
fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
fgmask = cv2.dilate(fgmask, None, iterations=2)

# Encontramos los cotnornos presentes en fgmask, para luego basándonos
# en su área poder determina si existe movimiento
cnts = cv2.findContours(fgmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
for cnt in cnts:
if cv2.contourArea(cnt) > 500:
x, y, w, h = cv2.boundingRect(cnt)
cv2.rectangle(frame, (x,y), (x+w, y+h),(0,255,0), 2)
texto_estado = "Estado: ALERTA Movimiento Detectado!"
color = (0, 0, 255)

# Visuzalizamos el alrededor del área que vamos a analizar
# y el estado de la detección de movimiento
cv2.drawContours(frame, [area_pts], -1, color, 2)
cv2.putText(frame, texto_estado , (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, color,2)

cv2.imshow('fgmask', fgmask)
cv2.imshow("frame", frame)

k = cv2.waitKey(70) & 0xFF
if k == 27:
break

cap.release()
cv2.destroyAllWindows()

Quedaría así:







Copiamos el archivo aeropuerto.mp4 a c:\


y pulsamos el botón EXECUTE SCRIPT

y ya tendríamos funcionando nuestro script en python funcionando dentro de Delphi, en el que detectaría la presencia de personas que atraviesen el área marcada en rojo, mostrando una alerta.










































Suscribirse :



Weiterlesen...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz