PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

80
UNIVERSIDAD ANDRÉS BELLO Facultad de Ingeniería Escuela de Industrias PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN AUTOPISTAS BASADO EN VISIÓN ARTIFICIAL Tesis de pregrado para optar al título de Ingeniero en Automatización y Robótica Autor: Fabian Quintana Marín Profesor Guía: Néstor Palominos González Santiago de Chile, 2016

Transcript of PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

Page 1: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

UNIVERSIDAD ANDRÉS BELLO

Facultad de Ingeniería

Escuela de Industrias

PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN AUTOPISTAS

BASADO EN VISIÓN ARTIFICIAL

Tesis de pregrado para optar al título de Ingeniero en Automatización y Robótica

Autor:

Fabian Quintana Marín

Profesor Guía:

Néstor Palominos González

Santiago de Chile, 2016

Page 2: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

2

UNIVERSIDAD ANDRES BELLO

FACULTAD DE INGENIERÍA

ESCUELA DE INDUSTRIAS

INGENIERÍA EN AUTOMATIZACIÓN Y ROBÓTICA

DECLARACIÓN DE ORIGINALIDAD Y PROPIEDAD

Yo, Fabian Antonio Quintana Marin, declaro que este documento no incorpora material de

otros autores sin identificar debidamente la fuente.

Santiago de Chile, 2016

_________________________

Firma del alumno

Page 3: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

3

Agradecimientos

Agradecimientos especiales a mi familia que siempre confió en mí y me apoyó en

todo lo necesario, siempre se hicieron el tiempo para estar conmigo y preocuparse

por lo que estuviera haciendo.

A mis maestros los cuales nunca dejaron de enseñarme, a todos aquellos que

sabían lo que podía dar.

A mis compañeros los cuales me apoyaron en todo lo que podían, ya sea con

materiales o con conocimiento.

Page 4: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

4

Dedico esta tesis tanto a mi madre como a mi padre por

formarme como persona, por darme siempre la confianza para

avanzar, por apoyarme en cada paso que he dado en mi vida.

Además dedico esta tesis a todos los profesores que han creído

en mí y me han apoyado en mi formación como ingeniero.

Page 5: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

5

Índice general

Agradecimientos ................................................................................................................................. 3

Índice general ...................................................................................................................................... 5

Índice figuras ....................................................................................................................................... 7

Resumen ............................................................................................................................................ 11

Abstract ............................................................................................................................................. 12

1 – Antecedentes generales .............................................................................................................. 13

1.1 – Introducción ......................................................................................................................... 13

1.2 – Objetivos .............................................................................................................................. 14

1.2.1 – Objetivo general ................................................................................................................ 14

1.2.2 – Objetivos específicos ..................................................................................................... 14

2 –Marco Teórico .............................................................................................................................. 15

2.1 – Estado del arte...................................................................................................................... 15

Percepción del objeto. .................................................................................................................. 15

2.1.1 – Ultrasonido .................................................................................................................... 16

2.1.2 – Foreground mask ........................................................................................................... 18

2.1.3 – Template matching........................................................................................................ 19

2.1.4 – Haarcascade .................................................................................................................. 21

2.1.4.1 – Conteo .................................................................................................................... 23

2.1.4.2 – Grafico .................................................................................................................... 24

2.1.4.3 – Haar-like Features .................................................................................................. 26

2.2 – Herramientas utilizadas ........................................................................................................ 28

2.2.1 – Hardware ....................................................................................................................... 28

2.2.1.1 – Computador ........................................................................................................... 28

2.2.1.2 – Cámara webcam ..................................................................................................... 28

2.2.2 – Software ........................................................................................................................ 30

2.2.2.1 – Python2.7 ............................................................................................................... 30

2.2.2.2 – OpenCV 3.1.0 .......................................................................................................... 31

2.2.2.3 – HaarCascade ........................................................................................................... 32

Page 6: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

6

2.2.2.4 – LabVIEW ................................................................................................................. 34

3 - Desarrollo del proyecto ................................................................................................................ 35

3.1- Moldeamiento de la solución ................................................................................................ 35

3.1.1- Detectar en imagen ......................................................................................................... 35

3.1.2- Detectar en video ............................................................................................................ 46

3.1.3- Detectar en cámaras ip ................................................................................................... 52

3.1.4- Guardar valores en texto ................................................................................................ 55

3.1.5- Graficar datos Labview .................................................................................................... 56

4.- Limitaciones ................................................................................................................................. 66

Código ............................................................................................................................................... 68

Analizar imagen ............................................................................................................................. 68

Contar en imagen .......................................................................................................................... 69

Analiza video ................................................................................................................................. 70

Analiza cámara IP .......................................................................................................................... 71

Analiza video y guarda en archivo ................................................................................................. 73

Referencias ........................................................................................................................................ 79

Page 7: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

7

Índice figuras

Fig.1 (ultrasonido, origen“ultrasonido-hc-sr04”, zona maker) ......................................... 16

Fig.2 (ultrasonido diagrama de bloque, origen propio) .................................................... 17

Fig.3 (ultrasonido rango, origen“ultrasonido-hc-sr04”, zona maker) ............................... 17

Fig.4 (foreground mask, origen “vehicle detection, tracking and couting“) ..................... 18

Fig.5 (foregroung mask diagrama, origen propio) ............................................................ 18

Fig.6 (Template matching, origen “Open CV docs”) ......................................................... 19

Fig.7 (template matching diagrama, origen propio) ......................................................... 20

Fig.8 (Diagrama HaarCascade, origen propio)................................................................... 21

Fig.9 (HaarCascade ejemplo, origen propio) ..................................................................... 22

Fig.10 (OpenCV Líneas finales, origen propio) .................................................................. 23

Fig.11 (LabVIEW Grafico, origen National Instrument) ..................................................... 24

Fig.12 (Datos, origen propio) ............................................................................................. 25

Fig.13 (LabVIEW diagrama, origen propio) ....................................................................... 25

Fig.14 (Conjunto de caracteristicas, origen Docs OpenCV ) .............................................. 26

Fig.15 (Conjunto ampliado, origen Docs OpenCV ) ........................................................... 27

Fig.16 (SAT y RSAT, origen docs Opencv) .......................................................................... 27

Fig.17 (Cámara, origen “Camera web INTEX”) .................................................................. 28

Fig.18 (Python logo, origen Python ) ................................................................................. 30

Fig.19 (OpenCV Logo, origen “Open CV”) ......................................................................... 31

Fig.20 (OpenCV y Python, origen propio) .......................................................................... 31

Fig.21 (LabVIEW Logo, origen National Instrument) ......................................................... 32

Fig.22 (LabVIEW Logo, origen National Instrument) ......................................................... 34

Fig.23 (Diagrama de flujo, origen propio) ......................................................................... 35

Fig.24 (Diagrama de bloque, origen propio) ..................................................................... 36

Fig.25 (posición puntos en imagen, origen propio) .......................................................... 38

Fig.26 (Diagrama de flujo opencv-python, origen propio) ................................................ 40

Fig.27 (auto sin modificar, origen propio) ......................................................................... 42

Fig.28 (auto encontrado, origen propio) ........................................................................... 42

Fig.29 (conjunto imagenes, origen propio) ....................................................................... 42

Page 8: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

8

Fig.30 (conjunto encontrado, origen propio) .................................................................... 42

Fig.31 (LabVIEW Logo, origen National Instrument) ......................................................... 45

Fig.32 (LabVIEW Logo, origen National Instrument) ......................................................... 45

Fig.33 (Diagrama de flujo python video, origen propio) ................................................... 48

Fig.34 (video detectado, origen propio) ............................................................................ 48

Fig.35 (dimensiones imagen, origen propio)..................................................................... 49

Fig.36 (Linea final, origen propio) ..................................................................................... 50

Fig.37 (LabVIEW Logo, origen National Instrument) ......................................................... 51

Fig.38 (Diagrama de flujo, origen propio) ......................................................................... 56

Fig.38 (Open/Create/Replace file, origen Labview) .......................................................... 57

Fig.39 (Conexión Open/Create/Replace file, origen propio) ............................................. 57

Fig.40 (Get File Size, origen Labview) ................................................................................ 57

Fig.41 (Conexión Get File Size, origen propio) .................................................................. 58

Fig.42 (While Loop, origen Labview) ................................................................................. 58

Fig.43 (Conexión While Loop Izquierdo, origen propio) ................................................... 58

Fig.44 (Wait Until Next ms Multiple, origen Labview) ...................................................... 59

Fig.45 (Conexión Wait Until Next ms Multiple, origen propio) ......................................... 59

Fig.46 (Set File Position, origen Labview) .......................................................................... 59

Fig.47 (conexión Set File Position, origen propio) ............................................................. 59

Fig.48 (Read from Text File, origen Labview) .................................................................... 60

Fig.49 (Conexión Read from Text File, origen propio) ...................................................... 60

Fig.50 (Fract/Ext String To Number, origen Labview) ....................................................... 60

Fig.51 (Conexión Fract/Ext String To Number, origen propio) .......................................... 61

Fig.52 (Waveform panel frontal, origen Labview) ............................................................ 61

Fig.53 (Posicion actual, origen propio) .............................................................................. 62

Fig.54 (Conexión stop, origen propio) ............................................................................... 62

Fig.55 (Close File, origen Labview) .................................................................................... 62

Fig.56 (Conexión Close File, origen propio) ....................................................................... 63

Fig.57 (Simple Error Handler.vi, origen Labview) .............................................................. 63

Fig.58 (Conexión Simple Error Handler.vi, origen Labview) .............................................. 63

Fig.59 (Conexión Diagrama de bloque, origen propio) ..................................................... 64

Page 9: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

9

Fig.60 (números con 6 decimales random, origen Propio) ............................................... 64

Fig.61 (Waveform grafico, origen propio) ......................................................................... 65

Page 10: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

10

Page 11: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

11

Resumen

Este documento presenta una respuesta a la pregunta de cómo tener un control

del número de vehículos que pasan por la autopista para poder establecer una

relación adecuada entre los vehículos que entran y salen de Santiago, buscando

reducir los denominados “tacos”.

Lo primero es determinar la forma de obtener la imagen para trabajar, el cual fue

por medio de webcam, el medio para recopilar las imágenes es por OpenCV 3.1.0

el cual puede funcionar para C# o para Python, este último es el que se usará,

este es usado en su versión 2.7, una vez se ha determinado el medio de obtención

de imagen es necesario encontrar un medio que pueda determinar donde se

encuentra el vehículo en la imagen, se determinó usar Haarcascade, el cual

corresponde a una herramienta de OpenCV la cual consta de una base de

imágenes la que compara con la imagen que se obtuvo por la webcam, y OpenCV

se encarga de enmarcar en un rectángulo la posición del automóvil, después de

tener enmarcado el auto con los elementos ya descritos se necesita conocer la

cantidad de autos que ciertamente pasan por esta autopista, esto se logro con los

puntos que nos envía el Haarcascade, con esto se genera una línea final la cual

sumara uno al contador de autos de dicha autopista.

Los problemas a los que se enfrenta el programa es que pasen autos demasiado

juntos entre sí, otro factor importante son elementos semejante a autos los cuales

el programa puede determinar cómo vehículos, o vehículos que no son detectados

ya sea por color o forma.

Esto se validó con un video y capturas de cámara en tiempo real, con una

precisión de 86%, en el cual el programa contó 19 autos de 22.

Palabras claves: (Python, OpenCV, Visión, Artificial, Haarcascade,

Automóviles, Camaras)

Page 12: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

12

Abstract

This paper presents an answer to the question of how to control the number of

vehicles passing through the highway to establish a proper relationship between

vehicles entering and leaving Santiago , seeking to reduce the so-called " tacos".

The first is to determine how to get the image to work, which was through webcam,

the way to collect the images is by OpenCV 3.1.0 which can work for C # or

Python, the last one is the used in this paper and is used in his version 2.7, once

you have determined the means of obtaining image is necessary to find a medium

that can determine where the vehicle are in the image, it was determined using

Haarcascade, this is a tool for OpenCV which It consists of a base of images which

compares the image obtained by the webcam, and OpenCV is responsible for

framing a rectangle the position of the car, after having framed the car with the

elements already described will need to knowhow many cars are going througt the

roadway this was obtanaible with the points that Haarsccascade give, wich was

used to put a finish line, everytime a car pass that line the count will increase in

one.

The problems with that this program face are that cars going a little bit closer,

another thing is that the program will frame things that are similar to cars, and

some cars will not be frame at all becouse of form or color.

This was validated with a video and captures of a camera in real time, with a

precission of 86%, it counted 19 of 22 vehicles.

Keyword: (Python, OpenCV, Vision, Artificial, Haarcascade, Cars, Cameras)

Page 13: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

13

1 – Antecedentes generales

1.1 – Introducción

La cantidad de congestiones a la que se enfrenta Santiago en los horarios de

punta es un tema del cual todos han oído hablar, bajo la premisa de poder calcular

la cantidad de vehículos que pasan por las calles más transitadas se gestiono este

proyecto, este documento muestra los medios para llegar a esa meta.

Este proyecto se enfoca en la cantidad de vehículos que pasan en una calle

determinada, como respuesta a esto se decidió implementar un sistema, el cual

registra la cantidad de vehículos que pasan y la hora a la que estos transitaron

guardando la cantidad total de vehículos que transita por hora en un archivo, con

esto en mente se aplicó visión artificial la cual se lleva a cabo con OpenCV en el

entorno de Python, dicho sistema de conteo se implementara en el costado de una

calle, con esto se espera observar cual es el volumen de autos que pasan en

dicha vía y las horas punta, todo esto se plantea para que se pueda evaluar si la

calle en si da abasto a la cantidad de vehículos que por ella transitan.

Para el cálculo de la cantidad de vehículos se ha hecho uso de Haarcascade para

OpenCV lo cual permite identificar los autos presentes en cada frame del video,

este programa los encuentra y devuelve los puntos para enmarcarlos, luego se

usa la opción de dibujo de OpenCV y se enmarcan en el frame final, ahora esto lo

hace por cada frame del video, dando la sensación de que presenta un video

siendo que solo está evaluando cuadro a cuadro, dado a esto se necesita generar

una línea para determinar la parte final de la carretera para poder contar la

cantidad de autos sin repetirse.

Una vez traspasada una hora se genera un archivo con el numero de todos los

autos que han transitado en dicha hora, para después ser representados en un

grafico, dicho grafico fue diseñado en Labview.

Page 14: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

14

1.2 – Objetivos

1.2.1 – Objetivo general

Desarrollar un sistema que cuente el flujo de vehículos en una calle, para saber

cuántos autos pasan por de ella y a qué hora transitan más vehículos.

1.2.2 – Objetivos específicos

Desarrollar sistema de visión artificial, que detecte la posición de los

vehículos

Crear un sistema de conteo de vehículos, que tenga una precisión mayor al

80%.

Desarrollar una base de datos que guarde la hora a la que pasan los

vehículos.

Crear una aplicación que determine la proporción que debe tener la

autopista en vigilancia para que se pueda generar un flujo acorde a la

cantidad de vehículos que entran o salen de Santiago.

Page 15: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

15

2 –Marco Teórico

2.1 – Estado del arte

Hoy en día se precisa de un sistema de monitoreo continuo y autómata respecto a

control vehicular, con esto se ha implementado un sistema que pueda contabilizar

automóviles, con este objetivo en mente en distintas partes del mundo se han

implementado distintos tipos de sistemas específicamente diseñados para control

vehicular algunos de estos métodos son por ultrasonido o por visión artificial.

Percepción del objeto.

Se ha implementado diversas formas para ubicar los vehículos, algunos métodos

utilizan ultrasonido, otros con visión artificial, ahora hablaremos de ambos

métodos.

Page 16: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

16

2.1.1 – Ultrasonido

La detección por ultrasonido puede proporcionar una estimación de la distancia

entre el objetivo medido y nuestro punto de referencia, el problema radica

principalmente en que no se puede verificar si el objeto es o no un vehículo, para

lo cual se ha de implementar una relación que evalué los movimientos y determine

que es un vehículo por ende se decidió no utilizar este método.

Fig.1 (ultrasonido, origen“ultrasonido-hc-sr04”, zona maker)

Page 17: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

17

Su funcionamiento es que “genera un impulso ultrasónico. Los impulsos emitidos

viajan a la velocidad del sonido hasta alcanzar un objeto, entonces el sonido es

reflejado y captado de nuevo por el receptor de ultrasonido. Se cuenta el tiempo

que tarde en llegar el eco. Este tiempo se traduce en un pulso de eco de anchura

proporcional a la distancia a la que se encuentra el objeto” (Coe Gerald, 2016)

Fig.2 (ultrasonido diagrama de bloque, origen propio)

Fig.3 (ultrasonido rango, origen“ultrasonido-hc-sr04”, zona maker)

Page 18: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

18

2.1.2 – Foreground mask

El control por medio de visión artificial por su parte cuenta con distintos tipos de

detección entre los cuales se hallan las siguientes, primero hablaremos de resta

de ambiente, “al comparar una imagen con un auto y otra imagen con el ambiente

sin el automóvil, podemos determinar donde se encuentran los objetos nuevos los

cuales son los automóviles” (Sobral Andrew, 2015) con este método solo aparece

en la imagen unas partes blancas las cuales se determina que son los autos.

Fig.4 (foreground mask, origen “vehicle detection, tracking and couting“)

Fig.5 (foregroung mask diagrama, origen propio)

Page 19: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

19

2.1.3 – Template matching

Una forma de detectar por medio de visión artificial es con template matching el

cual requiere 2 cosas primordiales una imagen de fuente y la imagen que

queremos encontrar, la forma en la que funciona esta técnica es que la imagen

que queremos encontrar se moverá pixel por pixel en la imagen de fuente hasta

que se encuentre la coincidencia más alta. (Roberto Brunelli, 2009)

Fig.6 (Template matching, origen “Open CV docs”)

Page 20: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

20

El problema más grande de este método es el hecho de que deberíamos tener

una imagen para cada tipo de auto y comparar todos los autos con el frame de

video, además de que la imagen del auto que debemos proporcionar debe

coincidir completamente, lo cual deja este método inutilizable dado a que

requeriría demasiado tiempo para evaluar la imagen de todos los autos con todos

los pixeles de la imagen hasta que los detecte a todos.

Fig.7 (template matching diagrama, origen propio)

Page 21: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

21

2.1.4 – Haarcascade

Ahora se describirá la detección por medio de haarcascade, este método usa

openCV él cual se encuentra tanto para Python como para C#, el método en

cuestión consiste en que se toma la imagen actual completa, y la traduce en una

escala de colores grises, para después compararlo con su base de datos, donde

tiene almacenada distintas imágenes de autos todos en un tamaño determinado y

en escala de colores grises, si se encuentra una relación entre la imagen enviada

y las pertenecientes a su base de datos entonces devuelve al programa los datos

(x, y, h, w) que indica los lugares donde se encuentra dicha coincidencia en

nuestra imagen, con (x,y) tenemos el primer punto en el borde superior izquierdo y

con (x+w, y+h) tendremos el segundo punto en el borde inferior derecho, como lo

muestra la siguiente imagen.

Fig.8 (Diagrama HaarCascade, origen propio)

Page 22: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

22

A continuación se les presentara un ejemplo de haarcascade, la primera imagen

muestra la fotografía sin modificar tomada a un vehículo, la segunda imagen

muestra como haarcascade y opencv encierran dicho vehículo en un rectángulo, la

tercera imagen muestra donde se encuentran los dos puntos necesarios para

poder enmarcar el vehículo.

Fig.9 (HaarCascade ejemplo, origen propio)

Page 23: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

23

2.1.4.1 – Conteo

El conteo de los vehículos se logró con openCV dado a que haarcascade envía los

puntos donde se encuentra los objetos identificados en cada imagen, si se analiza

una sola imagen entonces se agrega un contador por cada cuadrado creado en

OpenCV.

Al analiza un video se debe asegurarse de no contar más de una vez cada

vehículo lo cual se logró delimitando una línea final y una pequeña área de

seguridad a esa línea, cuando un objeto identificado como un auto entra en el

área se guarda la posición en “x” donde se encuentra y se guarda como prevx, si

entra un objeto a la línea final y la diferencia entre “prevx” y el “x” actual es mayor

a un rango dado entonces podemos asumir que es otro vehículo que se encuentra

en otro carril, la desventaja de esto es cuando dos autos vienen muy cerca y por el

mismo carril puede que no cuente todos los vehiculos.

Fig.10 (OpenCV Líneas finales, origen propio)

Page 24: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

24

2.1.4.2 – Grafico

Una vez terminada una hora la cantidad de autos que se detectaron en dicha hora

pasaran a un archivo para que más tarde sean representados en una grafica, esta

grafica se realiza con Labview, cada dato guardado debe tener un formato

establecido y debe coincidir con el de labview, esto para que labview lea la

cantidad exacta en cada línea y no se exceda o quede sin algún numero en su

lectura.

Labview abrirá el archivo, obtendrá su tamaño, leerá línea a línea el archivo,

transformara lo que lee a numero y lo graficara, si no detecta mas información el

programa o si detecta algún error se detendrá.

Fig.11 (LabVIEW Grafico, origen National Instrument)

Page 25: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

25

Fig.12 (Datos, origen propio)

Cada numero tiene 4 dígitos, además de /n para señalar el salto de pagina, por lo

cual al leer un numero en Labview hemos de asegurarnos que este avance de 6

en 6 cada vez que lee un numero

Fig.13 (LabVIEW diagrama, origen propio)

Page 26: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

26

2.1.4.3 – Haar-like Features

Este proyecto detecta imágenes por medio de un sistema conocido por Haarlike

features, a diferencia de Templete matching que comprueba la imagen pixel por

pixel para buscar la similitud este método busca características Haar-like, este se

basa en la diferencia entre la suma de todos los pixeles en algunas regiones

rectangulares contiguas, estas características no varían por escala o por

luminosidad además de ser robustas al ruido de la imagen.

Este método fue propuesto por Paul Viola y Michael Jones y mejorado por Rainer

Lienhart y Jochen Maydt.

El método propuesto en un principio constaba con el siguiente conjunto de

características

Fig.14 (Conjunto de caracteristicas, origen Docs OpenCV )

Page 27: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

27

Al extender el primer conjunto el conjunto de característica resultante fue

Fig.15 (Conjunto ampliado, origen Docs OpenCV )

Estas características son determinadas con la imagen principal o SAT (Summed

Area Table) y la imagen principal rotada 45° o RSAT (Rotate Summed Area Table)

En la imagen SAT cada pixel SAT(x,y) contiene la suma de todos los pixeles, y en

la imagen RSAT cada pixel del cuadrado rotado 45° es sumado

Fig.16 (SAT y RSAT, origen docs Opencv)

Page 28: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

28

2.2 – Herramientas utilizadas

2.2.1 – Hardware

2.2.1.1 – Computador

Se utiliza un computador con las siguientes especificaciones: Windows 10, 4gb de ram, 1,7ghz.

Se puede usar una Raspberry pi 2 o la Raspberry pi B+ como cambio de hardware dado a que este permite la instalación de Python, OpenCV y un módulo de cámara.(Adrian Rosebrock, 2015,“install opencv and python on your Raspberry pi 2 and B+”, “Pyimagesearch”)

2.2.1.2 – Cámara webcam

Cualquier webcam sirve para el propósito de captar automóviles, se recomienda

usar alguna con una definición media, se utiliza la HP TrueVision HD con una

resolución de 0,9 megapixeles la cual viene integrada en notebook

Fig.17 (Cámara, origen “Camera web INTEX”)

Page 29: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

29

2.2.1.3 – Cámara IP

Se utiliza una cámara ip para poder observar carreteras o calles sin tener que

estar específicamente en el lugar, utilizando la dirección web de la cámara para

visualizar el video que este trasmite, se utiliza una cámara IP con el código de

MXC CIP-197380 tiene Pan-tilt resolución 720p (1280x720) 25 fps y distancia

infrarrojo de 10 metros.

Fig.17 (Cámara IP, origen Mirax)

Page 30: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

30

2.2.2 – Software

2.2.2.1 – Python2.7

Es un lenguaje de programación, creado por un europeo llamado Guido Van

Rossum, el cual usaremos para poder comandar la cámara web, a este entorno de

programación le agregaremos la librería OpenCV 3.1.0 para poder conectarnos a

la cámara, además de agregar unos archivos (XML) de haarcascade para el

reconocimiento de autos.

Este es un lenguaje de programación de propósito general orientado a objetos, es

un lenguaje de script independiente de la plataforma preparado para realizar

cualquier tipo de programa entre sus beneficios se encuentra la cantidad de

librerías que contiene y las funciones incorporadas en el mismo lenguaje, la

sencillez con la que se puede crear programas y la cantidad de plataformas donde

se puede trabajar.

Dado a que es un lenguaje de propósito general se puede crear cualquier tipo de

programa, en cuanto a su independencia de la plataforma quiere decir que se

puede implementar en distintos sistemas informáticos.

Fig.18 (Python logo, origen Python )

Page 31: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

31

2.2.2.2 – OpenCV 3.1.0

OpenCV es una librería de Python y de otros lenguajes de comunicación, lo que

esta librería hace es crear un medio entre Python y las cámaras conectadas al

computador, además de que incluye funciones para grabado de video, fotografías

o modificaciones de colores a las imágenes, además de poder modificar imágenes

agregando líneas o figuras a nuestra disposición, para unir opencv a python es

necesario mandar un archivo llamado cv2.pyd que se encuentra en la carpeta de

Opencv a la carpeta site-package de python dentro de Lib.

Fig.19 (OpenCV Logo, origen “Open CV”)

Fig.20 (OpenCV y Python, origen propio)

Page 32: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

32

2.2.2.3 – HaarCascade

El HaarCascade es un clasificador (clasificador en cascada), creado por Paul Viola

y mejorado por Rainer Lienhart, el cual compara la imagen enviada con una base

de datos que tiene, este clasificador tiene apartados para distintos tipos de objetos

los cuales incluyen caras, autos, manos u ojos, etc.

HaarCascade tiene una gama de fotos tomadas, las cuales se dividen en dos

grupos, positivas y negativas, el grupo de imágenes positivas son similares al

objeto en cuestión en una escala de grises, el grupo de imágenes negativas son

objetos que puede haber en la región de la imagen y que no se quiere que

resalten, la imagen que se manda debe estar en una escala de colores grises para

que HaarCascade la reconozca, una vez ya la ha reconocido envía al programa

las coordenadas X, Y, W, H donde encontró el objeto.

Al recibir en el programa las coordenadas x, y, w, h se genera un rectángulo para

enmarcar dicho objeto.

Fig.21 (LabVIEW Logo, origen National Instrument)

Page 33: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

33

Para crear un Cascade se necesitan 3 carpetas una donde estén ubicadas las

imágenes negativas, anteriormente descritas como objetos distintos al se quiere

ubicar, otra carpeta para las imágenes positivas que si pertenece al objeto se

quiere ubicar, y la tercera es donde se guardara el archivo XML se crea un archivo

de texto llamado negative.txt donde se agregaran las rutas a todas las imágenes

negativas, se crea un segundo archivo llamado positive.txt donde se encentre las

rutas a todas las imágenes positivas además de la posición donde ese encuentra

el objeto u objetos en la imagen y cuantas veces se encuentran en la imagen,

ubicándose en la pantalla de comandos de python en el apartado de herramientas

se agrega el texto

opencv_createsamples.exe -vec bin_desc.vec -info positive.txt -bg negative.txt

Con lo que se crea un archivo llamado bin_desc.vec el cual llamaremos usando

opencv_traincascade.exe -data cascade -vec bin_desc -bg negative.txt

Creando el archivo llamado cascade.xml que es donde se encuentra el nuevo

cascade para usar.

Page 34: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

34

2.2.2.4 – LabVIEW

LabVIEW es una plataforma y entorno de desarrollo con un lenguaje gráfico, este

programa fue creado por National Instrument, los programas desarrollados se

denominan VI’s o Instrumentos virtuales, se caracteriza por su facilidad de uso,

con este se puede desarrollar programas realmente complejos imposibles de

desarrollar en otros lenguajes tradicionales.

Fig.22 (LabVIEW Logo, origen National Instrument)

Page 35: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

35

3 - Desarrollo del proyecto

3.1- Moldeamiento de la solución

3.1.1- Detectar en imagen

La estructura del proyecto comienza con un sistema encargado de la adquisición

de datos, en este sistema se encuentra la cámara y Haarcascade, estos entregan

la imagen del entorno y la posición de los autos. El video entregado por la cámara

esta simulada con un video previamente obtenido donde se observan distintos

autos en una carretera. En una implementación futura se deberá cambiar el video

por una cámara en tiempo real.

Fig.23 (Diagrama de flujo, origen propio)

Page 36: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

36

Haarcascade nos devuelve los puntos donde se encuentra los autos en base al

video obtenido.

Para poder usar la cámara en Python se ha de instalar OpenCV a este, para

lograrlo se debe enviar el archivo cv2.pyd a la librería de python “site-package”

Ya en el entorno de programación de python lo primero que se debe hacer será

importar cv2 con el comando

import cv2

Paso seguido se identifica el haarcascade a utilizar con el comando

cv2.CascadeClassifier('')

autocascade = cv2.CascadeClassifier('/Users/aa/Desktop/FaceDetect-

master/cars3.xml')

Se guarda el video capturado en una variable, para el video se usa el comando

cv2.VideoCapture

video = cv2.VideoCapture('/Users/aa/Desktop/FaceDetect-master/video

frente.mp4')

Fig.24 (Diagrama de bloque, origen propio)

Page 37: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

37

Procesamiento de imagen es el siguiente proceso por el que se pasara, después

de obtener la imagen se usa haarcascade para que nos dirá donde se encuentra

cada auto en dicha imagen, y se usara OpenCV para modificar la imagen donde

se encuentran los objetos, se dibujaran recuadros enmarcando a cada auto que el

programa reconozca, además de agregar una línea final que se usara más

adelante.

Para realizar una pequeña prueba se usaron distintas imagen con autos presente,

y se modificó el código en la recepción del video, reemplazamos

video = cv2.VideoCapture('/Users/aa/Desktop/FaceDetect-master/video

frente.mp4')

Con

imagen = cv2.imread('/Users/aa/Desktop/FaceDetect-master/autos1.jpg')

Se agrega al código

while True:

gris = cv2.cvtColor(imagen, cv2.COLOR_BGR2GRAY)

auto = autocascade.detectMultiScale(gris, 1.8, 6)

Con el cual se cambia los colores de la imagen a una escala de colores con el

código

cv2.cvtColor(imagen, cv2.COLOR_BGR2GRAY)

Page 38: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

38

Se aplica el haarcascade con el código

autocascade.detectMultiScale(gris, 1.8, 6)

En el cual “gris” es la imagen modificada y “1.8” es el factor de escalado y “6” es el

tamaño mínimo del objeto, es posible agregar otro valor después de este seguido

con una “,” extra indicando el tamaño máximo

El cascade nos devolverá los puntos (x, y, w, h) halladas en “auto”

Fig.25 (posición puntos en imagen, origen propio)

Page 39: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

39

Se agrega al código:

for (x, y, w, h) in auto:

cv2.rectangle(imagen, (x, y), (x+w, y+h), (0, 0, 255), 3)

cv2.imshow('imagen auto', imagen)

Donde cv2.rectangle genera un rectángulo en la imagen titulada “imagen” cuyo

primer punto se encuentra en (x,y) y su segundo punto se encuentra en (x+w ,

y+h) y despues se le da el color con la forma (0, 0, 255)siendo este en base a

RGB donde está representado (AZUL,VERDE,ROJO) siendo 255 el color máximo

de cada uno y al final se determina el grosor de la línea

Y cv2.imshow muestra una ventana titulada ‘imagen auto’ donde se muestra la

imagen guardada con el nombre “imagen”, esta imagen es la misma imagen que

modificaron al agregare el rectángulo

Al final se agrega

if cv2.waitKey(1) & 0xFF == ord('e'):

break

cv2.destroyAllWindows()

Para poder terminar el programa se presiona la tecla “e” en la ventana creada con

el título de “imagen auto”.

Page 40: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

40

Fig.26 (Diagrama de flujo opencv-python, origen propio)

Page 41: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

41

Al final el código de prueba queda de la siguiente forma

import cv2

autocascade = cv2.CascadeClassifier('/Users/aa/Desktop/FaceDetect-

master/cas4.xml')

imagen = cv2.imread('/Users/aa/Desktop/FaceDetect-master/autos1.jpg')

while True:

gris = cv2.cvtColor(imagen, cv2.COLOR_BGR2GRAY)

auto = autocascade.detectMultiScale(gris, 1.8, 6, 9)

for (x, y, w, h) in auto:

cv2.rectangle(imagen, (x, y), (x+w, y+h), (0, 0, 255), 3)

cv2.imshow('imagen auto', imagen)

if cv2.waitKey(1) & 0xFF == ord('e'):

break

cv2.destroyAllWindows()

Page 42: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

42

Se prueba que el programa puede reconocer autos usando distintas imágenes

Fig.27 (auto sin modificar, origen propio)

Fig.28 (auto encontrado, origen propio)

Fig.29 (conjunto imagenes, origen propio)

Fig.30 (conjunto encontrado, origen propio)

Page 43: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

43

Para contar la cantidad de autos en la imagen se agrega al código antes de entrar

al for :

font=cv2.FONT_HERSHEY_SIMPLEX

Con el cual se define la fuente con la que escribirá en la imagen

nauto = 0

Se define un nauto que representara el numero de autos en la imagen

Y después de entrar al for se agregara un

nauto=nauto+1

Con el cual cada vez que se entre a este for se sumara un auto al contador y

después transformamos el numero a string

txt=str(nauto)

Una vez transformado el numero a string agregamos la siguiente línea al código

cv2.putText(img,'autos: '+txt,(30,60),font,2,(0, 0, 0),1,cv2.LINE_AA)

Se define el texto que irá en la imagen, este texto debe estar después del ciclo for

Page 44: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

44

Quedando el código estructurado de la siguiente manera

import cv2

font=cv2.FONT_HERSHEY_SIMPLEX

autocascade = cv2.CascadeClassifier('/Users/aa/Desktop/FaceDetect-

master/cas4.xml')

img = cv2.imread('muchos autos.png')

gris = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

fh, fw, fd = img.shape

font=cv2.FONT_HERSHEY_SIMPLEX

auto = autocascade.detectMultiScale(gris, 1.2, 7)

nauto = 0

for (x, y, w, h) in auto:

cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 3)

nauto=nauto+1

txt=str(nauto)

cv2.putText(img,'autos: '+txt,(30,60),font,2,(0, 0, 0),1,cv2.LINE_AA)

cv2.imshow('img',img)

cv2.waitKey(0)

cv2.destroyAllWindows()

Page 45: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

45

Una vez terminado de modificar el código se prueba si funciona utilizando un

conjunto de autos más grande, se prueba si puede contarlos en una imagen

estática

Fig.31 (LabVIEW Logo, origen National Instrument)

Fig.32 (LabVIEW Logo, origen National Instrument)

Page 46: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

46

3.1.2- Detectar en video

Ahora se prueba con un video

Se reemplaza

imagen = cv2.imread('/Users/aa/Desktop/FaceDetect-

master/autos1.jpg')

Con

video = cv2.VideoCapture('/Users/aa/Desktop/FaceDetect-master/video

frente.mp4')

Este código guarda el video a reproducir en la variable llamada video

Se le agrega el siguiente código después del while true

ret, img = video.read()

Esta línea guarda la imagen actual del video en la variable img

Page 47: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

47

Se cambia las variables con nombre “imagen” por “img” dejando el código de esta

manera

import cv2

autocascade = cv2.CascadeClassifier('/Users/aa/Desktop/FaceDetect-

master/cars3.xml')

video = cv2.VideoCapture('/Users/aa/Desktop/FaceDetect-master/video

frente.mp4')

while True:

ret, img = video.read()

gris = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

auto = autocascade.detectMultiScale(gris, 1.1, 6)

for (x, y, w, h) in auto:

cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 3)

cv2.imshow('imagen auto', img)

if cv2.waitKey(1) & 0xFF == ord('e'):

break

cv2.release()

cv2.destroyAllWindows()

Page 48: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

48

Fig.33 (Diagrama de flujo python video, origen propio)

Fig.34 (video detectado, origen propio)

Page 49: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

49

Después de obtener los datos y modificar la imagen se pasa a determinar la

cantidad de autos pasando por esta carretera, este punto se logro con la posición

final de cada auto y una línea para comparar.

Con este fin agregamos

fh, fw, fd = img.shape

Con el cual se obtiene las dimensiones de la imagen.

Donde fh representa la cantidad de filas que tiene la imagen fw representa la

cantidad de columnas que tiene la imagen y fd representa la cantidad de colores.

Fig.35 (dimensiones imagen, origen propio)

Page 50: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

50

Se agrega

cv2.line(img ,(0,int(fh*0.6)), (int(fw),int(fh*0.6)) ,(255,0,0),4)

El cual dibuja una línea ubicada en un 60% desde el comienzo de la imagen hasta

el final con un color azul, para generar una línea en opencv se necesita usar un

código con la siguiente forma

cv2.line(imagen a modificar,primer punto inicial(x,y),segundo punto final

(x,y),color en RGB (AZUL,VERDE,ROJO),grosor de línea)

En la siguiente imagen se generaron 3 líneas, 2 de las cuales tienen distinto

tamaño

Fig.36 (Linea final, origen propio)

Page 51: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

51

Una vez se tiene la línea final y las posiciones de los autos se pueden comparar, si

un automóvil atraviesa la línea inferior entonces un contador de autos aumentara,

con esto nos aseguramos de contar solo elementos móviles y no contar falsos

positivos “objetos parecidos a autos”, además de que nos aseguramos de no

contar vehículos de otra autopista o en dirección contraria.

Fig.37 (LabVIEW Logo, origen National Instrument)

Page 52: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

52

3.1.3- Detectar en cámaras ip

Pruebas con cámaras IP, para utilizar una cámara IP se necesita conocer la

dirección web a la que se redirige la cámara, además de usuario y contraseña si

fuese necesario, primero que nada se debe importar vlc, este es un reproductor de

videos con la cualidad de poder reproducir videos desde urls

Fig.37 (Diagrama de flujo cámara ip, origen propio)

Page 53: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

53

Primero se importa vlc al código, este se importa para poder reproducir el formato

de video de la cámara ip

import vlc

Se agrega al codigo

player=vlc.MediaPlayer('direccion url')

player.play()

Con lo cual se guarda el video que se encuentra en la dirección proporcionada con

el nombre de player, paso seguido se reproduce el video que se encuentra

guardado en player.

Se agrega el siguiente código dentro del while

player.video_take_snapshot(0, '.snapshot.tmp.jpg', 0, 0)

frame = cv2.imread('.snapshot.tmp.jpg')

Con este fragmento el reproductor toma un snapshot del video actual y después el

frame lo lee

Page 54: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

54

El código debería quedar de la siguiente forma

import cv2

import vlc

autocascade = cv2.CascadeClassifier('/Users/aa/Desktop/FaceDetect-

master/cas3.xml')

player=vlc.MediaPlayer('rtsp://192.168.0.100/onvif2')

player.play()

while True:

player.video_take_snapshot(0, '.snapshot.tmp.jpg', 0, 0)

frame = cv2.imread('.snapshot.tmp.jpg')

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

auto = autocascade.detectMultiScale(gris, 1.1, 6)

for (x, y, w, h) in auto:

cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 1)

cv2.imshow('video', frame)

if cv2.waitKey(1) & 0xFF == ord('e'):

break

video.release()

cv2.destroyAllWindows()

Page 55: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

55

3.1.4- Guardar valores en texto

Para guardar los números que hemos obtenido con opencv y haarcascade en un

archivo de texto necesitamos crear una variable con la siguiente configuración

Archivo = open(nombre,modo)

En nombre debemos escribir el nombre y el tipo de archivo que queremos crear ej

‘History.txt’

En la sección modo tendremos que elegir el tipo de permiso que tendrá el

programa con respecto al archivo existen 3 permisos

R con este solo se puede leer el archivo

W crea y abre el archivo para escribir en el

A abre el archivo, si no existe lo crea y después puede escribir en el

Archivo = open(‘history.txt’,’ a’)

Para escribir en el agregamos

Archivo.write(‘Texto’)

El texto que nuestro archivo tendrá es Texto, si se quiere generar un salto de línea

se agrega un /n al final

Una vez terminamos de utilizar el archivo de texto se debe de cerrar con un

Archivo.close

Page 56: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

56

3.1.5- Graficar datos Labview

Una vez se ha guardado los datos en un documento se busca representarlos en

un grafico, dicho grafico fue desarrollado con labview.

Para representar el grafico se sigue el siguiente procedimiento

Fig.38 (Diagrama de flujo, origen propio)

Page 57: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

57

Siguiendo el diagrama de flujo se crea un programa en labview para mostrar un

grafico con los datos reunidos.

Primero se agrega el icono de Open/Create/Replace file.

Fig.38 (Open/Create/Replace file, origen Labview)

Se crea la dirección donde se encuentra el archivo, se determina que acción

realizara el icono y que acceso tiene al documento

Fig.39 (Conexión Open/Create/Replace file, origen propio)

Se incluye Get File Size con el cual se puede obtener el tamaño del archivo que

lee desde el conector file

Fig.40 (Get File Size, origen Labview)

Page 58: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

58

Se conecta el Get File Size con el icono anterior de la siguiente manera, el tamaño

del archivo sale desde el conector size, este valor se entrega en bytes

Fig.41 (Conexión Get File Size, origen propio)

Se agrega un While Loop que genera un ciclo el cual terminara cuando ciertas

condiciones se cumplan

Fig.42 (While Loop, origen Labview)

Se conecta Get File Size al While Loop y se cambia las entradas a shift register de

la siguiente forma, además se agrega una constante de 0 y se le cambia la

entrada a shift register

Fig.43 (Conexión While Loop Izquierdo, origen propio)

Page 59: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

59

Se necesita agregar un Wait Until Next ms Multiple con el cual el ciclo funciona en

milisegundos multiples del numero que se le entrega al conector millisecond

multiple

Fig.44 (Wait Until Next ms Multiple, origen Labview)

Solo necesita un controlador con el múltiplo en milisegundos dentro del while loop,

con lo cual el programa funcionara en ciclos múltiplos de este milisegundo

Fig.45 (Conexión Wait Until Next ms Multiple, origen propio)

Ahora se conecta un Set File Position, este número cambia la posición donde

inicia el documento

Fig.46 (Set File Position, origen Labview)

Quedando de esta forma

Fig.47 (conexión Set File Position, origen propio)

Page 60: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

60

Ahora se necesita conectar un Read from Text File

Fig.48 (Read from Text File, origen Labview)

En el conector de count o contador se le agrega la cantidad de decimales que

tendrá cada número en el archivo, en el conector llamado text o texto devuelve los

datos que ha leído con formato de string, en el conector file está conectado al

refnum out del icono set file position, por lo cual este icono lee 10 caracteres a la

derecha desde la posición entregada en por el set file position

Fig.49 (Conexión Read from Text File, origen propio)

Se transforma el texto en string a número con Fract/Ext String To Number

Fig.50 (Fract/Ext String To Number, origen Labview)

Una vez transformado el string a número este se conecta con un waveform chart

Page 61: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

61

Fig.51 (Conexión Fract/Ext String To Number, origen propio)

El Waveform Chart tiene un componente en el frontal panel

Fig.52 (Waveform panel frontal, origen Labview)

Page 62: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

62

Ahora el while loop necesita un botón para detenerse, esto se logra con la

siguiente conexión

Al dato actual se le suma 10, este número (10) debe ser igual al tamaño de cada

número contando comas y saltos, después este nuevo numero pasa con el shift

register de vuelta al comienzo del loop

Fig.53 (Posicion actual, origen propio)

Si el dato actual es igual a la cantidad de datos en el documento o si se encuentra

un error en la programación el programa se detiene.

Fig.54 (Conexión stop, origen propio)

Una vez se detiene el loop se necesita cerrar el archivo con el icono Close File

Fig.55 (Close File, origen Labview)

Page 63: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

63

Se conecta de esta forma

Fig.56 (Conexión Close File, origen propio)

Y al final se agrega un Simple Error Handler.vi

Fig.57 (Simple Error Handler.vi, origen Labview)

Fig.58 (Conexión Simple Error Handler.vi, origen Labview)

Una vez conectado todo, el diagrama de bloques se debería ver de la siguiente

forma.

Page 64: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

64

Fig.59 (Conexión Diagrama de bloque, origen propio)

El documento de texto tiene 600 números con el siguiente formato

Fig.60 (números con 6 decimales random, origen Propio)

Page 65: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

65

Al graficar el documento completo, el programa grafica los números desde 0 a 599

Fig.61 (Waveform grafico, origen propio)

Page 66: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

66

4.- Limitaciones

Este proyecto tiene distintos tipos de limitaciones a la hora de su implementación,

las limitaciones más severas que este tiene son las siguientes.

La primera son las horas de operación, el programa funcionara mejor durante el

día

Otra limitación es la dirección en la cámara, el proyecto reconoce autos en

posiciones muy específicas.

Page 67: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

67

Conclusiones

Este proyecto se planteo con la problemática de evaluar el flujo de automóviles en

carreteras o calles, buscando entregar las herramientas para saber dónde y a qué

hora se congestionan.

Este desafío a presentado distintas problemáticas a la hora de implementarlo, ya

sea la luminosidad del día, la posición en la que se detectan los autos, o los

colores que estos tienen.

Aun con todas estas problemáticas se ha logrado distintos tipos de resultados,

aunque no son totalmente satisfactorios si se demuestra que se puede llegar a

implementar.

Page 68: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

68

Código

Analizar imagen

import cv2

autocascade = cv2.CascadeClassifier('/Users/aa/Desktop/FaceDetect-

master/cas4.xml')

imagen = cv2.imread('/Users/aa/Desktop/FaceDetect-master/autos1.jpg')

while True:

gris = cv2.cvtColor(imagen, cv2.COLOR_BGR2GRAY)

auto = autocascade.detectMultiScale(gris, 1.8, 6, 9)

for (x, y, w, h) in auto:

cv2.rectangle(imagen, (x, y), (x+w, y+h), (0, 0, 255), 3)

cv2.imshow('imagen auto', imagen)

if cv2.waitKey(1) & 0xFF == ord('e'):

break

cv2.destroyAllWindows()

Page 69: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

69

Contar en imagen

import cv2

font=cv2.FONT_HERSHEY_SIMPLEX

autocascade = cv2.CascadeClassifier('/Users/aa/Desktop/FaceDetect-

master/cas4.xml')

img = cv2.imread('autos1.jpg')

gris = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

fh, fw, fd = img.shape

font=cv2.FONT_HERSHEY_SIMPLEX

auto = autocascade.detectMultiScale(gris, 1.3, 7)

nauto = 0

for (x, y, w, h) in auto:

cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 3)

nauto=nauto+1

txt=str(nauto)

cv2.putText(img,'autos: '+txt,(30,60),font,1,(255, 255,

255),1,cv2.LINE_AA)

cv2.imshow('img',img)

cv2.waitKey(0)

cv2.destroyAllWindows()

Page 70: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

70

Analiza video

import cv2

autocascade = cv2.CascadeClassifier('/Users/aa/Desktop/FaceDetect-

master/cars3.xml')

video = cv2.VideoCapture('/Users/aa/Desktop/FaceDetect-master/video

frente.mp4')

while True:

ret, img = video.read()

gris = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

auto = autocascade.detectMultiScale(gris, 1.1, 6)

for (x, y, w, h) in auto:

cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 3)

cv2.imshow('imagen auto', img)

if cv2.waitKey(1) & 0xFF == ord('e'):

break

cv2.release()

cv2.destroyAllWindows()

Page 71: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

71

Analiza cámara IP

import cv2

## Se importa cv2 para analizar video

import vlc

## Se importa vlc para reproducir un video con formato rtsp

autocascade = cv2.CascadeClassifier('/Users/aa/Desktop/FaceDetect-

master/cars3.xml')

## Se define “autocascade” con el clasificador que se usara, donde dice

/Users/aa/Desktop/FaceDetect-master/cars3.xml

## Se define la url de donde se tiene guardado el archivo xml con el

cascade que se ha de usar

player=vlc.MediaPlayer('rtsp://192.168.0.100/onvif2')

## Se define player como el video captado de la dirección establecida

player.play()

## Se reproduce el video que actualmente se encuentra en player

while True:

player.video_take_snapshot(0, '.snapshot.tmp.jpg', 0, 0)

##Se toma un snapshot del video y se guarda con el nombre .snapshot.tmp-

jpg

frame = cv2.imread('.snapshot.tmp.jpg')

## Frame se define como la imagen tomada del video

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

## Se guarda frame en escala de colores grises en la variable gris

auto = autocascade.detectMultiScale(gris, 1.1, 6)

## Se aplica Haarcascade a la imagen guardada en gris

Page 72: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

72

for (x, y, w, h) in auto:

cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 1)

## Se dibuja un rectángulo en la posición donde se encuentra el auto

cv2.imshow('Video', frame)

## Se muestra la imagen en una ventana llamada Video

if cv2.waitKey(1) & 0xFF == ord('e'):

break

## Se cierra el while, se libera el video y se cierra las ventanas

video.release()

cv2.destroyAllWindows()

Page 73: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

73

Analiza video y guarda en archivo

import cv2

## Se importa la librería para procesamiento de imagen

import datetime

## Se importa el tiempo

autocascade = cv2.CascadeClassifier('/Users/aa/Desktop/FaceDetect-

master/cars3.xml')

## Se define "autocascade" con el clasificador que se usara, donde dice

/Users/aa/Desktop/FaceDetect-master/cars3.xml

## Se agrega la url de donde esta guardado el archivo xml con el cascade

que se usara

font=cv2.FONT_HERSHEY_SIMPLEX

## Se define un tipo de fuente

numauto = 0

numauto2 = 0

numauto3 = 0

## se crea 3 contadores distintos para poder establecer un promedio

prevy=0

prevx=0

prevx2=0

prevx3=0

video = cv2.VideoCapture('/Users/aa/Desktop/FaceDetect-master/video

frente.mp4')

## Se define la dirección del video

Page 74: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

74

while True:

utcnow = datetime.datetime.utcnow()

## Se guarda el tiempo actual en utc en una variable llamada utcnow

ret, img = video.read()

## Se guarda el frame actual del video en una variable llamada img

fh, fw, fd = img.shape

## Se guarda las dimensiones de img

gris = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

## Se le transforma la imagen a una escala de colores grises

cv2.imshow('video frente', img)

## se muestra el video en una ventana llamada video frente

auto = autocascade.detectMultiScale(gris, 1.1, 6)

## Se le aplica el clasificador a la imagen en gris

cv2.line(img ,(0,int(fh*0.6)), (int(fw),int(fh*0.6)) ,(255,0,0),4)

cv2.line(img ,(0,int(fh*0.6-12)), (int(fw),int(fh*0.6-12))

,(255,0,0),1)

cv2.line(img ,(0,int(fh*0.6+12)), (int(fw),int(fh*0.6+12))

,(255,0,0),1)

cv2.line(img ,(0,int(fh*0.7)), (int(fw),int(fh*0.7)) ,(255,0,0),4)

cv2.line(img ,(0,int(fh*0.7-12)), (int(fw),int(fh*0.7-12))

,(255,0,0),1)

cv2.line(img ,(0,int(fh*0.7+12)), (int(fw),int(fh*0.7+12))

,(255,0,0),1)

cv2.line(img ,(0,int(fh*0.8)), (int(fw),int(fh*0.8)) ,(255,0,0),4)

cv2.line(img ,(0,int(fh*0.8-12)), (int(fw),int(fh*0.8-12))

,(255,0,0),1)

cv2.line(img ,(0,int(fh*0.8+12)), (int(fw),int(fh*0.8+12))

,(255,0,0),1)

## Se dibujan las líneas

Page 75: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

75

txt=str((numauto+numauto2+numauto3)/3)

minu=str(utcnow.minute)

hora=str(utcnow.hour)

segu=str(utcnow.second)

##Se genera un texto donde estará el promedio de las 3 mediciones

## Se genera variables para los segundos, minutos y horas

cv2.putText(img,'autos: '+txt,(30,60),font,2,(0, 0, 0),1,cv2.LINE_AA)

cv2.putText(img,'horaUTC: '+ hora +':'+ minu +':'+

segu,(600,60),font,1,(0, 0, 0),1,cv2.LINE_AA)

## Se agregan textos en la imagen indicando cuantos autos se

encuentran en la imagen, además de la hora actual en utc

for (x, y, w, h) in auto:

if (x<fw*0.7):

cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 3)

cv2.imshow('webcam', img)

if (y+h <(fh*0.6+15)) & (y+h > (fh*0.6-15)) & ((prevx-x)>20):

numauto=numauto+1

if (y+h <(fh*0.6+12)) & (y+h > (fh*0.6-12)):

prevx=x

if (y+h <(fh*0.7+20)) & (y+h > (fh*0.7-29)) & ((prevx2-x)>20):

numauto2=numauto2+1

if (y+h <(fh*0.7+12)) & (y+h > (fh*0.7-12)):

prevx2=x

if (y+h <(fh*0.8+20)) & (y+h > (fh*0.8-29)) & ((prevx3-x)>20):

numauto3=numauto3+1

if (y+h <(fh*0.8+12)) & (y+h > (fh*0.8-12)):

prevx3=x

## Se restringe el modificador para que solo se evalúen los autos

en la autopista que van en un solo sentido, además se generan 3 lineas de

medición donde cada línea suma a un contador distinto

Page 76: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

76

if cv2.waitKey(1) & 0xFF == ord('e'):

##Cuando la tecla “e” es presionada el while se cerrara y además

generara un archivo de texto donde se guardara la cantidad de autos

que conto, en un formato de 4 digitos desde 0000 hasta 9999

if numtxt<10:

doc = open('History.txt','a')

doc.write('000'+txt+'\n')

if numtxt<100 and numtxt>=10:

doc = open('History.txt','a')

doc.write('00'+txt+'\n')

if numtxt<1000 and numtxt>=100:

doc = open('History.txt','a')

doc.write('0'+txt+'\n')

if numtxt>=1000:

doc = open('History.txt','a')

doc.write(txt+'\n')

break

## al salir del while se cierra el archivo, se libera el video y se

cierran todas las ventanas

doc.close()

video.release()

cv2.destroyAllWindows()

Page 77: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

77

import cv2

## importamos cv2 la libreria para la camara

autocascade = cv2.CascadeClassifier('/Users/aa/Desktop/FaceDetect-

master/cars3.xml')

## definimos “autocascade” con el clasificador que usaremos, donde dice

/Users/aa/Desktop/FaceDetect-master/cars3.xml

## agregaremos la url de donde tenemos guardado nuestro archivo xml con

el cascade que usaremos

font=cv2.FONT_HERSHEY_SIMPLEX

## definimos Font como un tipo de fuente para los números y letras que

pondremos en la imagen

numauto = 0

## numauto es el contador de los autos

prevy=0

## prevy es el valor previo de y

prevx=0

## Al igual que prevy, prevx es el valor previo de x

video = cv2.VideoCapture('/Users/aa/Desktop/FaceDetect-master/video

frente.mp4')

## Video es la variable donde se guardara el video, tenemos que

determinar el lugar y el archivo por completo, incluido el formato

while True:

ret, img = video.read()

## img es el frame actual del video en cuestion

fh, fw, fd = img.shape

## fh, fw y fd son valores de la imagen que nos muestran su ancho,alto y

fondo

gris = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

## Cambiamos la imagen a una escala de colores grises

cv2.imshow('video frente', img)

## Se muestra la imagen sin modificación con el titulo video frente

auto = autocascade.detectMultiScale(gris, 1.1, 6)

Page 78: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

78

## Mandamos la imagen en la escala de grises al cascade hubicado en

autocascade

cv2.line(img,(0,int(fh*0.6)),(int(fw),int(fh*0.6)),(255,0,0),4)

## Dibujamos una linea que marca el punto medio de medida

cv2.line(img,(0,int(fh*0.6-12)),(int(fw),int(fh*0.6-12)),(255,0,0),1)

## Dibujamos una línea mostrando el punto máximo

cv2.line(img,(0,int(fh*0.6+12)),(int(fw),int(fh*0.6+12)),(255,0,0),1)

## Dibujamos la última línea que representa el punto minimo

txt=str(numauto)

## Transformamos numauto de un int a un streing para poder representarlo

cv2.putText(img,'autos: '+txt,(30,60),font,2,(0, 0, 0),1,cv2.LINE_AA)

## Escribimos “autos: ‘numero de autos contados’”

for (x, y, w, h) in auto:

## Cuando Haarcascade encuentra un objeto similar a un auto envía los

datos “X”, “Y”, “W” y “H”

cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 3)

## Dibujamos un rectángulo en los puntos donde se encuentra el auto

cv2.imshow('Detecta', img)

## mostramos el resultado total en una ventana aparte llamada Detecta

if (y+h <(fh*0.6+15)) & (y+h > (fh*0.6-15)) & ((prevx-x)>20):

numauto=numauto+1

if (y+h <(fh*0.6+12)) & (y+h > (fh*0.6-12)):

prevx=x

if cv2.waitKey(1) & 0xFF == ord('e'):

break

video.release()

cv2.destroyAllWindows()

## si apretamos la tecla “e” el programa sale del while libera el video y

destruye las ventanas abiertas

Page 79: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

79

Referencias

[1] S.Sivaraman, M.M.Trivedi, Lab. for Intell. & Safe Automóviles, Univ. of California San Diego, La

Jolla, CA, USA (diciembre de 2013) looking at vehicles on the road a survey of visión-based

vehicle detection, tracking and behavior.

[2] Ahmed Nabil Belbachir, Michael hofstätter, Martin Litzenberger y Peter Schön (10 de febrero de

2011) High speed embedded object analysis using a dual line timed address event temporal

contrast visión sensor.

[3] Edgar A. Bernal, Wencheng Wu, Orhan Bulan, Robert P. Loce (6-9 de octubre 2013) Monocular

visión based vehicular speed estimation from compressed video streams.

[4] Kiran Kumar KV, Pallavi Chandrakant, Santosh Kumar, Kushal KJ (8-10 de enero de 2014)

Vehicle speed detection using corner detection.

[5] A Nurhadiyatna, B. Hardjono, A. Wibisono, I. Sina, W. Jatmiko, M. Anwar Ma’sum y P.

Mursanto. (28-29 de septiembre de 2013) Improved vehicle speed estimation using gaussian

mixture model and hole filling algoritm.

[6] Zhiyuan Li, Naira Hovakimyan, Vladimir Dobrokhodov y Isaac Kaminer (15-17 de diciembre de

2010) Vision based target tracking and motion estimation using a small uav.

[8] Junda Zhu, Liang Yuan, Yuang F. Zheng, Robert L. Ewing (octubre de 2012) Stereo visual

tracking within structured envirionments for measuring vehicle speed.

[9]Wang Xiaoyong, Wang Bo, Song Lu (2012) Real time on road vehicle detection algorithm based

on monocular visión

[10] Seunghwan Baek, Heungseob Kim, Kwangsuck Boo.(10-12 de noviembre de 2014) robust

vehicle detection and tracking method for blind spot detection system using visión sensors

[11]Eric Hernandez Castillo, Zizilia Zamudio Beltran, Juan Manuel Ibarra Zannatha.(15-18 de

noviembre de 2011) Soccer ball speed estimation using optical flow for humanoid soccer

player.

[12]Lu Weina, Tian Shuyao, Zhang Lihong, Ma Jiwei, Liu Shengtao, Lin Hongju (10-11 de julio de

2010) Preceding vehicle detecting and tracking for intelligent vehicles.

[13]Tomoyuki Mori, Sebastian Scherer. ( 6-10 de mayo de 2013) First results in detecting and

avoiding frontal obstacles from a monocular camera for micro unmanned aerial vehicles.

[14]Andres Felipe Hurtado, Jairo Alejandro Gomez, Victor Manuel Peñeñory (24-27 de noviembre

2015) Proposal of a computer visión system to detect and track vehicles in real time using an

embedded platform enabled with a graphical processing unit.

Page 80: PROTOTIPO DE SISTEMA DE CONTEO VEHICULAR EN …

80

[15]Minkyu Cheon, Wonju Lee, Changyong Yoon y Mignon Park (septiembre 2012)Vision based

vehicle detection system with consideration of the detecting location.

[16]Huasheng Zhu, Chenguang Xu, Fan li (2013) The traffic volumen count algorithm based n

computer vision

[17] Y.M.Chan, S.S.Huang, L.C.Fu, P.Y.Hsiao, M.F.Lo, (17 de abril de 2010) Vehicle detection and

tracking under various lighting conditions using a a particle filter

[18] Akhan Almagambetov, Senem Velipasalar, Mauricio caseres(5 de febrero de 2015) Robust

and computationallyu lightweight autonomous tracking of vehicle taillights and signal

detection by embedded smart cameras

[19] Youpan Hu, Qing He, Xiaobin Zhuang, Haibin Wang, Baopu Li, Zhenfu Wen, Bin Leng, Guan

Guan, Donghue Chen (diciembre de 2013) Algorith for visión based vehicle detection and

classification.

[20] Frank (16/4/2015)Car tracking with cascades. Obtenido de

Pythonspot:https://pythonspot.com/en/car-tracking-with-cascades/

[21]“AALEEKH” (2014) Python-Based-Image-Recogntion. Obtenido de

Github:https://github.com/AALEKH/Python-Based-Image-Recogntion/blob/master/cars3.xml

[22] abhi kumar (2014) CAR-DETECTION. Obtenido de Github:

https://github.com/abhi-kumar/CAR-DETECTION/blob/master/cas1.xml

https://github.com/abhi-kumar/CAR-DETECTION/blob/master/cas2.xml

https://github.com/abhi-kumar/CAR-DETECTION/blob/master/cas3.xml

https://github.com/abhi-kumar/CAR-DETECTION/blob/master/cas4.xml

[23] Andrews Sobral (2015) Vehicle Detection, Tracking and Counting. Obtenido de

Behance:https://www.behance.net/gallery/Vehicle-Detection-Tracking-and-Counting/4057777