Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Once

#61
Python / Visión artificial con Python
Abril 09, 2017, 12:44:36 AM
Originalmente posteado en: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



El objetivo de esta entrada (y en general de esta serie de entradas) es llevar la visión artificial a cualquier usuario de Python gracias  a las libreria OpenCV y Numpy. En esta entrada en concreto se abordará un poco de la teoría sobre la visión artificial pero lo suficiente como para comprender el material de las próximas entradas.



Representación digital de las imágenes

Antes de comenzar, debemos tener en cuenta cómo están representadas las imágenes o dicho de otra manera, cómo es una imagen para el computador.


  • Lo primero y más importante es que una imagen no es más que una matriz numérica (para imágenes en blanco y negro o a escala de grises) o varias matrices para imágenes a color. A cada una de estas matrices las llamamos componente.
  • Cada entrada de ésta matriz es un número que representa el color que debe tener la imagen en esa coordenada y que llamamos píxel y al valor de cada píxel lo llamamos nivel de gris.

Sistema de visión artificial

Un sistema de visión artificial generalmente se puede dividir en cinco etapas principales:


  • Adquisición imágenes: Es la etapa donde se forma y adquiere la imagen (rayos x, cámaras tradicionales, cámaras infrarojas, ultrasonido, etc).
  • Pre-procesamiento: Es la etapa que busca mejorar la calidad de la imagen para que pueda ser usada después.
  • Segmentación: Es la etapa donde se separan los distintos objetos presentes en la imagen.
  • Extracción de caracteristicas:  Es la etapa donde se obtienen las caracteristicas de los objetos previamente segmentados (color, dimensiones, textura).
  • Toma de desiciones: Es la etapa donde, a partir de los resultados de la etapa anterior se toma una decisión, como por ejemplo mover un brazo robótico a una coordenada específica.


Representación del color
Modelo de color

Un modelo de color es un modelo mate mático que permite representar los colores en forma numérica.

Existen varios modelos de color que aunque se puede representar la misma imagen usando varios modelos, en visión artificial es útil muchas veces representar las imágenes usando modelos diferentes al RGB ya que distintos canales de distintos modelos pueden resaltar detalles diferentes aunque la información completa no cambie.

Algunos modelos
RGB
El modelo RGB (Red, Green and Blue) es un modelo en el que los colores pueden ser representados por un vector de tres posiciones que representan los niveles de intensidad de rojo, verde y azul para cada pixel. El modelo RGB es un modelo aditivo.
CMYK
El modelo CMYK (Cyan, Magenta, Yellow, Key) es un modelo en que los colores pueden ser representados por un vector de cuatro posiciones que a su vez representan los niveles de cian, magenta, amarillo y negro para cada pixel. Éste es un modelo sustractivo.


El histograma
El histograma es un gráfico que nos muestra las frecuencias de ocurrencia de los niveles de gris en una imagen.

El histograma es una herramienta muy importante (como veremos en las siguientes entradas) ya que nos permite hacernos una idea de qué operaciones debemos hacer a la imagen para mejorar su calidad, especialmente durante la etapa de preprocesamiento.



Imagen y su histograma.

Como se puede observar en la imagen anterior, en el eje de las x está representado el nivel de gris que puede tomar cada píxel (para una imagen de 8 bits, hay
2^8= 256 formas de representar los niveles de gris) y en el eje de las y está representado la cantidad de píxeles que hay por cada nivel de gris.

¿Qué es el ruido?
El ruido en las imágenes es información no deseada que contamina las imágenes. El ruido puede ser varios tipos y ser generado en la adquisición de la imagen por defectos del sensor o por errores o interferencias durante la transmisión de la imagen.

El ruido puede llegar a ser un gran problema cuando estamos haciendo visión por computador, especialmente en la etapa de segmentación, por eso uno de los principales objetivos de la etapa de preprocesamiento es intentar reducir el ruido de una imagen.

Algunos tipos de ruido.
Ruido gaussiano
Es el ruido cuya aparición sigue una distribución de probabilidad normal (o gaussiana).

Este tipo de ruido suele aparecer durante la adquisición de la imagen y se debe principalmente a condiciones de baja iluminación y/o altas temperaturas. Y durante la transmisión a causa del ruido electrónico en los circuitos.



Imagen sin ruido. Wikipedia


Imagen ruido gaussiano. Wikipedia.


Ruido sal y pimienta
También conocido como ruido impulsivo es ruido que consiste en pixeles  blancos sobre regiones negras (ruido tipo sal) y/o pixeles negros sobre regiones claras (ruido tipo pimienta).

Este tipo de ruido se debe a problemas en la conversión de la imagen en el sensor y/o errores en la transmisión.


Imagen con ruido impulsivo.


Referencias
[1] No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
[2] No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Fuente: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Saludos!
#62
Hola, eso depende de lo que queiras hacer y hasta donde quieras llegar, Arduino está pensado para hacer las cosas fáciles, te abstrae toda la electrónica dígital y te facilita muchísimo la programación, por lo que es muy, muy recomendado para personas que no tienen idea de electrónica y/o apenas están comenzado con la dígital.

Ahora, si ya sabes de electrónica y tienes el tiempo para aprender, (además del programador) vete por el PIC.

Saludos!
#63
Hola, el error lo tienes acá:

Código: python,8

n=input("ingrese tamanio:")
x=[]
y=[0]*n
for i in range(0,n):
    x.append(int(raw_input("ingrese valor:")))
m=0
for i in range(n,0,-1):
    m=m+1
    y[m]=x[i]
    print y[m]


Estás aumentando el contador antes de guardar en la memoria el elemento por lo que en lugar de guardar el primer elemento en la posición cero lo guardas en la posición uno y el último no lo guardas en la posición i sino en i+1 y por eso el IndexError

Saludos!
#64
Hola, antes que todo debes entender una cosa. El for de C y Python son distintos, en C el for es como un contador que v incrementando la variable acorde a lo que le indiques, en Python el for itera sobre una lista. Ahora la función range en Python lo que hace es generar una lista dependiendo de los parámetros que le pases:

Si le pasas un sólo argumento se generará una lista desde cero hasta el parametro que le pasaste menos uno.
Código: python
>>> list(range(5))
[0, 1, 2, 3, 4]


Si le pasas dos parametros generará una lista que va con los números del primer parametro hasta el segundo menos uno.
Código: python

>>> list(range(5, 10))
[5, 6, 7, 8, 9]


Si le pasas tres argumentos generará una lista que va del primer parámetro hasta el segundo pero en "saltos" del tercer parámetro.
Código: python

>>> list(range(0, 10, 2))
[0, 2, 4, 6, 8]


Ahora, el error que tienes está en: range(i-1,0) porque estás intentando ir de un número positivo hasta cero sumando de a uno, por lo que Python te devolverá una lista vacía:
Código: python

>>> list(range(10, 0,))
[]



La forma adecuada es indicar un step de -1:
Código: python
range(i-1, 0, -1)


Ahora, pasados este punto te encontrarás con un error porque no has "creado" la variable y. Lo solucionas con:

Código: python,3

n=int(raw_input("ingrese tamanio:"))
x=[]
y=[]
(...)


Y acá te encontrarás con otro error de tipo IndexError porque y es una lista vacía y estas intentando acceder a un elemento en la posición m. (Posición que no existe). Por lo que en lugar de acceder a la posición como tal y como estás recorriendo la primer lista desde atrás simplemente usa append para agregar los elementos desde el principio a la lista ordenada:

Y si quieres seguir usando la notación de C lo puedes hacer pero primero debes llenar la segunda lista:

Código: python,3

n=int(raw_input("ingrese tamanio:"))
x = []
y = [0] * n
(...)


Este código lo que hace es generar una lista con n elementos donde todos son cero.

Una vez acá no tendrás ningun error pero el código no funcionará bien porque tienes unos errores de lógica que es mejor que intentes resolver por tu cuenta. Si no los encuentras, vuelve a preguntar que te ayudo con gusto

Saludos!
#65
Dudas y pedidos generales / Re:pwm y vb.net
Diciembre 14, 2016, 04:20:37 PM
Hola, no sé .net, así que sólo te puedo ayudar con la parte del Arduino.

No entiendo muy bien, qué es lo que quieres hacer, pero mirando por encima el código, tu solo declaras la variable xxx, pero en ningun momento la actualizas, por lo que siempre va a valer 0, y el led que está en el puerto tres nunca se va a encender.

Código: cpp
analogWrite(LedPin,xxx); / Aca tendria que recibir los valores de 1 a 255 y mover o prender de apoco un led... 


PD: Ese comentario también está mal escrito, así que si tienes un error de compilación, es por eso.

Saludos!
#66
Los puertos abiertos y filtrados que devuelve son objetos NmapPort por lo que para mostrar los datos se debe har casi lo mismo que antes:

Código: python

    for puerto in host.closedFilteredPorts:
                print puerto.id
                print puerto.state
                print puerto.reason
                print puerto.port
                print puerto.name
                print puerto.version
                print puerto.scriptOutput


Y hay que hacer lo mismo,pero en lugar de los puertos filtrados, para los puertos abiertos.

El libro la verdad no lo conozco y no sé que nivel maneja, pero si es orientado para usuarios con pocos conocimientos en Python me parece terrible que falten tantas cosas que no son triviales para alguien que apenas comienza. Si el libro está orientado para usuarios con conocimientos medios en Python, no debería ser un problema.

Saludos!
#67
Python / Pequeño sistema plugins Python 3
Diciembre 11, 2016, 03:31:36 AM

En Python importar módulos en tiempo de ejecución es tan complicado como llamar un método. Esto, junto con algunas de las built-in functions como hasattr() y getattr() (que nos permiten tanto obtener como saber, respectivamente si un objeto existe en otro objeto) nos permitirá agregar funcionalidades a nuestros scripts sobre la marcha con relativamente poco esfuerzo.

Antes de comenzar a programar debemos definir la estructura que van a tener los plugins que se desean importar y por lo tanto cómo se van a implementar en el sistema base.

En esta entrada vamos a programar una calculadora en consola, donde cada función es implementada por un plugin. Las partes del sistema serán:


  • Base: Es quien implementa los plugins.
  • Loader: Es quien encuentra y carga los plugins.
  • Plugins: Son quienes añaden funcionalidades a la base.

La estructura en este caso va a ser muy simple, la calculadora usará un diccionario donde se guardará el nombre de la función como key y como value una tupla donde el primer elemento es la descripción de la función y el segundo la referencia a la función que se debe ejecutar cuando sea seleccionada esa opción.

Loader

El módulo importlib (en Python a partir de la versión 3.1) nos brinda, entre otros el método import_module() el cual nos permite cargar en tiempo de ejecución un módulo. Devuelve la referencia al módulo si este se pudo cargar o, en su defecto lanza un error del tipo: ImportError Ver documentación

Antes de poder importar los módulos, debemos encontrarlos y para eso usaremos las librerias glob y os:

glob.glob(pathname, recursive=False): Lista los elementos de un directorio, teniendo la posibilidad de usar comodines para encontrar archivos que cumplan con determinadas condiciones.
os.path.join(path, *paths): Devuelve un string con la concatenación de las rutas que recive como argumento.
os.path.isfile(path): Devuelve True si path es un archivo.
os.path.split(path): Devuelve una lista con la división de path en dos partes: primero la ruta del archivo y segundo el nombre del archivo.

Sólo necesitamos una función que liste los archivos de un directorio, encuentre los scripts de Python, los importe y guarde sus referencias para poderlos llamar luego.

Código: python

import os
import glob
import importlib


def load(ruta):
    cargados = []
    # Generamos una ruta de la forma: path/*.py
    # Que hace referencia a todos los archivos terminados en .py
    ruta_final = os.path.join(ruta, "*.py")
    for archivo in glob.iglob(ruta_final):  # Listamos los archivos directorio
        print("abriendo:", archivo)
        # Verificamos que la ruta pertenezca a un archivo
        if os.path.isfile(archivo):
            print("encontrado:", archivo)
            try:
                # formateamos a path_1/path_2.modulo
                ruta, archivo = os.path.split(archivo)
                modulo = "{0}.{1}".format(ruta, archivo[:-3])
                print("importando:", modulo)
                # Importamos el modulo
                cargados.append(importlib.import_module(modulo))
            except ImportError as e:
                print("Error cargando el modulo:", archivo)
                print(e)
                next  # En caso de error saltamos al siguiente archivo
    return cargados


La función load() recive como argumento la ruta donde se van a tener guardados los plugins. Se busca en esta ruta todos los archivos terminados en .py, los importamos y guardamos en una lista la referencia a tal módulo.

Base

Este es el esqueleto de la calculadora, donde el diccionario que se mencionó al comienzo de la entrada tiene la forma:

{"nombre_funcion": ("descripcion_de_la_función", referencia_funcion_ejecutar)}

Con este diccionario se generará el menú que se mostrará al usuario. Además, es importante porque esta estructura, de alguna forma, la deben cumplir los plugins para poder ser cargados adecuadamente.

Esta base, también será la encargada de verificar que los plugins que se cargaron con el loader sean válidos según la estructura que definimos anteriormente y así evitar errores.

Para hacer las validaciones necesarias, haremos uso de algunas de las ya mencionadas y muy útiles Built-in functions:

hasattr(objeto, nombre): Devuelve True si existe un objeto nombre en objeto (Todo en Python es un objeto, desde las clases hasta las variables)
getattr(objeto, nombre [, default]): Devuelve el objeto nombre de objeto. Si el objeto no existe y se especifica default devuelve éste valor, de los contrario lanza un error del tipo AtributeError.
isinstance(objeto, clase): Devuelve True si objeto es una instancia de clase.
callable(objeto): Devuelve True si objeto es una función, clase (cualquier objeto callable)
map(función, lista): Aplica una función a una lista de elementos y devuelve un iterador con el resultado que devuelve la función por cada elemento.
max(lista): Devuelve el elemento más grande de la lista.

Código: python

import load  # Importamos el loader


def cargar():
    """Llama al loader para que cargue los plugins."""
    print("Cargando los modulos")
    cargados = load.load("modulos")
    for modulo in cargados:
        # Verificamos que exista un objeto llamado menu
        if hasattr(modulo, "menu_plugin"):
            dic = modulo.menu
            if isinstance(dic, dict):  # Verificamos que sea un diccionario
                print("Agregando:", modulo.__name__)
                menu.update(dic)  # Agregamos el diccionario a menu


def mostrar():
    """Genera el menu a partir del diccionario."""
# Obtine la longitu del elemento mas largo
    max_key = max(map(len, menu.keys())) 
    print()
    for key in menu:  # Recorremos los elementos del menu
        print("{0}: {1}".format(key.ljust(max_key), menu[key][0]))
    print()

menu = {
    "cargar": ("Carga los modulos", cargar),
    "salir": ("Sale del programa", exit),
}

while True:
    mostrar()  # Mostramos el menu
    opcion = input("Elija una opcion: ")
    if opcion in menu:
        menu[opcion][1]()  # Ejecutamos la funcion correspondiente



dict.keys(): Devuelve un iterador con todas las llaves del diccionario
dict.update(iter): Agrega al diccionario los elementos del diccionario iter. no es necesario que iter sea un diccionario, también puede ser un elemento iterable que venga en pares (key, value).
str.ljust(len [,caracter]): Método de todos los objetos str que permite ajustar el texto para que cumpla con la longitud len, si se pasa el parámetro caracter con este se llena hasta legar a la longitud, si no se especifica se usan espacios en blanco. Esto caracteres se agregan a la derecha.

La función cargar() es la que se encarga de llamar al loader y agregar los módulos que cumplan con la estructura definida. Nótese que no se verifica en este ejemplo que el segundo elemento de la tupla del diccionario sea, por lo menos un objeto callable. Solo se verifica que en el módulo exista un diccionario con el nombre: menu_plugin. Los módulos que cumplen con la estructura son agregados al diccionario menu.

La función mostrar() genera e imprime un menú a partir del diccionario.

El bucle infinito es el encargado de mostrar cada vez el menú, verificar si la opción elegida por el usuario está en el menú y llamar a la función
correspondiente.


Plugins

Los plugins como mínimo deben cumplir con la estructura necesaria para ser agregados al sistema base. En este caso, elplugin debe tener un diccionario llamado menu_plugin con la estructura anteriormente y la función que se llamará cuando el plugin sea seleccionado.

En esta entrada se programarán dos plugins, uno que deriva una función usando sympy y otro que sume dos números.

Código: python

import sympy


def derivar():
    funcion = input("Ingrese la funcion a derivar: ")
    print(sympy.diff(funcion))

menu_plugin = {
    "derivar": ("Deriva una funcion usando sympy", derivar)
}


Código: python

def suma():
    a = int(input("Ingrese el primer numero: "))
    b = int(input("Ingrese el segundo numero: "))
    print("La suma es:", a + b)

menu_plugin = {
    "Suma": ("Suma dos numeros", suma)
}


Si los plugins están en un directorio distinto al directorio donde se encuentra la base, se debe agregar al directorio de los plugins un archivo llamado __init__.py que le indica a Python que los archivos que se encuentran en ese directorio pueden ser importados.

Nota final
El buen manejo de las excepciones es crucial para que los errores ocurridos en los plugins no afecten el funcionamiento del sistema base.

Fuente: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Saludos.
Once
#68
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Al final he tenido que formatear un poco todo el código porque me decía que no estaba bien el formato con los tabuladores. Ahora ya lo tengo OK.

Eso sucede porque estás usando tabulaciones para tabular y yo uso cuatro espacios para tabular. Te recomiendo que te acostumbres también a usar cuatro espacios como tabulador. La mayoría de los IDE's permiten cambiar la forma en que se tabula, solo busca en las configuraciones. Y la razón es simple, aunque Python permite tabular como uno quiera se ha establecido como estandar los cuatro espacios, así que la mayoria de los códigos que encontrarás en la web estaran tabulados de esta manera y si tabulas de otra forma vas a tener este tipo de errores siempre. No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Código: text
Traceback (most recent call last):
  File "./NmapHost.py", line 74, in <module>
    structureNmap = parseNmapScan(nm)
  File "./NmapHost.py", line 59, in parseNmapScan
    nmapHost.closedFilteredPorts.apend(nmapPort)
AttributeError: 'list' object has no attribute 'apend'

Código: text
else:
                                nmapHost.closedFilteredPorts.apend(nmapPort)



Eso es porque estás intentando invocar al método apend de una lista que no existe (y por eso el error) lo correcto es append y este método te permite agregar un nuevo elemento a una lista, lo que nos lleva lo siguiente:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Sin embargo, si las comento, al ser un else, el código funciona, sin embargo... según el libro creo que me debería de devolver más info. Porque a mi solo me devuelve esto:

192.168.1.1
up
syn-ack
[]
[]

Si comentas esa línea (o está mal escrita) no se agrega nada a la lista y no tendrás nada que mostrar en pantalla, por eso aparecen los [] que representa a una lista vacía.

Saludos!
#69
Hola, el script como dije antes, es completamente funcional, simplemente hay que imprimir los datos, pero todo funciona bien.

Las líneas se tienen que añadir después de llamar al método, en el código del primer post, sería en la línea 72.

Saludos!

#70
Hola, el script no devuelve nada porque no estás imprimiendo nada y no devuelve un error porque todo está bien.

Ahora, la función parseNmapScan() te devuelve una lista donde cada elemento es una instancia de la clase NmapHost, así que para ver el resultado tienes que recorrer esta lista y mostrar los datos que quieras ver, por ejemplo:

Código: python

        for host in structureNmap:
                print host.host
                print host.state
                print host.reason
                print host.openPorts
                print host.closedFilteredPorts


Saludos!
#71
Hola @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, ese "truco" no encripta sino que compila el script (*.pyc) que puede ser leído e interpretado por la máquina virtual de Python, pero de ninguna forma encripta el script. Además, usando la libreria No tienes permitido ver los links. Registrarse o Entrar a mi cuenta se pude recuperar el código original:

Código: python
python -m unpyclib.application -Dq keylogger.pyc


Saludos!
#72
Lo único que se me ocurre es que ofusques de alguna forma el usuario y la contraseña, pero para cualquiera que sepa leer el script sería muy fácil desofuscar los datos, así que lo mejor sería ofuscar por completo el script.

Saludos!
#73
Claro que es posible, por lo general como fresa usan un motorltool. Sí o sí vas a necesitar un Arduino o cualquier otra unidad de control. La ventaja de Arduino es que ya están los códigos hechos, solo es ensamblar todo y listo.

Acá No tienes permitido ver los links. Registrarse o Entrar a mi cuenta usan la CNC (además que explican cómo montar una) para imprimir el PCB. Falta ver cómo queda la baquelita luego, pero no debería ser un problema.

Saludos!
#74
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Conocimientos previos tengo de php y otros lenguajes,  solo que php no me gusta y estoy aprendiendo ahora python por mi cuenta...

Gracias.

Como fan de python, te puedo recomendar (además de Flask que ya lo mensionaste más arriba) Django. Con esto, si sabes JS y CSS tienes diversión asegurada para rato.

Saludos!
#75
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Gracias por responder, haré otra pregunta adicional ¿Con que otros estudios se complementan?
y claro, siempre uno intenta llegar a ser el mejor, así que espero profundizar al máximo posible este tema.

Necesitas muy buenas bases matemáticas para poder abordar bien el tema de la criptografía de una manera seria.

Saludos!
#76
Personalmente me parece que es muy incomodo virtualizar, además consume muchos recursos. Pero depende de lo que quieras hacer,porque si vas a estar cambiando en tre SOs sería mucho más incómodo tener que estar reiniciando a cada rato. Así que, dependiendo de tus necesidades, fíjate que es más cómodo para ti y quédate con esa opción.

Saludos!
#77
Con un lenguaje que se ejecute en el servidor lo veo muy difícil, lo único que se me ocurre es que uses JavaScript y Ajax para realizar una petición a una web que sabes está en linea y si no conecta puede ser porque ese usuario perdió la conexión a internet.

Saludos!
#78
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Edit: ya está instalado,  aunque seguí otra guía con más detalles.  Ahora me falta instalar todo lo que necesite y personalizarla,  de todas formas al mover las ventanas se "cortan",  eso es del driver de vídeo que no es el correcto?

Así es, acá No tienes permitido ver los links. Registrarse o Entrar a mi cuenta tienes una lista con los drivers, según tu tarjeta, instala el paquete que necesites.

Saludos!
#79
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Me quito el sombrero con el Segundo Nivel, gran trabajo repintando la imagen...

Gracias brother, esa también fue mi parte favorita de todo el reto y aún no sé si se puede lograr sin necesidad de programación (imagino que sí).

Saludos!
#80
Yo la verdad escucho música TODO EL DÍA y en la noche duermo escuchando música. Soy algo así como un melómano. Con respecto a la pregunta, me parece que es relativo y muy subjetivo a la persona. Yo por ejemplo me concentro mucho escuchando música en especias jam sessions, jazz y soundtracks por lo que escucho esta música para estudiar, pero para programar o simplemente perder el tiempo amo el rap y el blues, también algo de reggae y básicamente cualquier canción que me guste sin importar el género.

Uso audifonos cada que salgo de la casa, en la casa cuando quiero apreciar bien la música o hay mucho ruido.

Saludos!