The Goodn@meblog
Blog dedicado a la programación, mundo geek, y mucha tecnologia..
lunes, 9 de julio de 2012
Tutorial KINECT camaras RGB y de profundidad (DEPTH)
Hola
Empezaremos por lo básico, en Visual Studio 2010 creamos un nuevo proyecto WPF y en mi caso le llamare KinectPruebaCamaras.
Ahora bien una vez creado el proyecto con sus archivos iniciales nos vamos a agregar la referencia para trabajar con nuestra KINECT
Ok hasta este punto ahora vamos a nuestro código XAML de nuestra aplicación e insertamos dos controles de imagen dentro del Grid inicial donde la primera le llamaremos VideoImage y a la otra DepthImage
Bien ahora vamos a lo que en realidad tenemos que hacer, nos vamos al code behind de nuestro archivo MainPage.xaml y empezamos por lo siguiente agregando la Referencia con el siguiente código.
using Microsoft.Kinect;
ahora declaramos una variable de tipo KinectSensor que yo llamare sensor y dos variables una de tipo byte que llamare pixeldata y otra de tipo short que llamare pixel.
KinectSensor sensor = KinectSensor.KinectSensors[0];
byte[] pixelData;
short[] pixel;
Ahora debemos de habilitar las camaras con estas dos rutinas, uno para la cámara de RGB y la otra para la cámara de profundidad (DEPTH), debemos de indicar al Kinect que vamos a utilizar en este caso las dos camaras antes mencionadas.
public partial class MainWindow : Window
{
KinectSensor sensor = KinectSensor.KinectSensors[0];
byte[] pixelData;
short[] pixel;
public MainWindow()
{
InitializeComponent();
sensor.ColorStream.Enable();
sensor.DepthStream.Enable();
}
}
“Vamos bien ahí”… bueno ahora necesitamos indicar tanto iniciar el KINECT al correr la aplicación y cuando cerremos la aplicación con estas dos sencillas rutinas Start() y Stop()... (“sencillo no!?”) y en la sección del método Window_Loaded vamos a crear dos eventos ruteados dentro de la variable sensor que yo llame que contiene toda la información del dispositivo que son ColorFrameReady y DepthFrameReady.
private void Window_Loaded(object sender, RoutedEventArgs e)
{
sensor.ColorFrameReady += new EventHandler<ColorImageFrameReadyEventArgs>(sensor_ColorFrameReady);
sensor.DepthFrameReady += new EventHandler<DepthImageFrameReadyEventArgs>(sensor_DepthFrameReady);
sensor.Start();
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
sensor.Stop();
}
Bien ya creamos los objetos, tenemos las librerías de Kinect, inicializamos y cerramos nuestro dispositivo ahora bien falta capturar lo que nos llega de las dos camaras y guardarlas en una variable y mostrarlas en nuestra aplicación para poder empezar a trabajar en nuestro KINECT ahora vamos al método sensor_ColorFrameReady y colocamos el siguiente código.
void sensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
{
bool receivedData = false;
using (ColorImageFrame CFrame = e.OpenColorImageFrame())
{
if (CFrame == null)
{
}
else
{
pixelData = new byte[CFrame.PixelDataLength];
CFrame.CopyPixelDataTo(pixelData);
receivedData = true;
}
}
if (receivedData)
{
BitmapSource source = BitmapSource.Create(640, 480, 96, 96,
PixelFormats.Bgr32, null, pixelData, 640 * 4);
VideoImage.Source = source;
}
}
En el código que acabo de colocar creamos una variable de tipo boleana para detectar mediante una condición para capturar lo que nos arroja la cámara copiando los datos de lo que nos contiene CFrame y después volvemos a preguntar por nuestra variable boleana y de ser verdadero procede a crear un BitmapSource en el cual abrimos dándole los parámetros que demuestro en el código, detenerme a explicar los parámetros no son necesarios por ahora para este tutorial rapido pero en mi primer tutorial son los mismos parámetros que describi y explique, la novedad en esa función es que se pueden jugar ahora con valores superiores o inferiores en escalas proporcionales a la que colocamos por default que es 640 x 480.
Entonces bien ahora vamos a la siguiente cámara que es la de profundidad dando este codigo
void sensor_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
{
bool receivedData = false;
using (DepthImageFrame CFrame = e.OpenDepthImageFrame())
{
if (CFrame == null)
{
}
else
{
pixel = new short[CFrame.PixelDataLength];
CFrame.CopyPixelDataTo(pixel);
receivedData = true;
}
}
if (receivedData)
{
BitmapSource source = BitmapSource.Create(320, 240, 96, 96,
PixelFormats.Gray16, null, pixel, 320 * 4);
DepthImage.Source = source;
}
}
Es el mismo tratamiento que explique en el método anterior pero lo que cambia es el formato de Pixeles y le colocamos Gray16 (PixelFormats.Gray16) y cambiamos la resolución a 320 x 240 claro también podemos colocarle la resolución de la otra cámara 640 x 480
Ahora corremos nuestra aplicación y tenemos las 2 camaras, tanto la de profundidad como la RGB funcionando y habilitadas para trabajar con nuestra KINECT, es importante destacar que estos son los métodos básicos para tener en funcionamiento estas 2 camaras, ya el resto queda de parte de nuestra creatividad
Estoy trabajando actualmente en el siguiente Tutorial para reconocimiento del personaje y de las librerías Skeleton para hacer infinidades de cosas con nuestro KINECT.
Salu2
martes, 3 de julio de 2012
Skeletons?... el desarrollo de una interfaz verdaderamente natural..
Proporciona la capacidad de rastrear el cuerpo de los usuarios superior (10 Joints), y dan a la parte inferior del cuerpo si no son visibles o relevantes para la aplicación. Además, permite la identificación de usuario cuando se sienta en un objeto de silla, sillón o de otro inanimado.
En el rango cercano, los usuarios que están sentados o de pie, se puede seguir dentro de 40 cm (16 pulgadas) del sensor. Además, el motor de seguimiento del esqueleto es ahora más rápido, hacer un mejor uso de la CPU y la ampliación de los recursos informáticos. Además, la información que acaba de agregar la orientación conjunta de los esqueletos es ideal para escenarios de animación Avatar y la detección sencilla postura.
lunes, 2 de julio de 2012
Nuevos Tutoriales de KINECT en Español
Explicar entre las nuevas capacidades el uso del reconocimiento de voz, una demo de prueba para iniciar rapidamente las 2 camaras, la de profundidad y la de RGB, uso de las librerias Skeletons para el reconocimiento de personas e interaccion con las aplicaciones!..
domingo, 30 de octubre de 2011
Tutorial KINECT Hello World en la PC
- Sensor Microsoft KINECT.
- Cable conversor de puerto KINECT a USB. (este cable esta incluido cuando compras el KINECT aparte, para la versión que viene con el Xbox 360 no viene con esta extensión, pero se puede conseguir fácilmente en una tienda Microsoft Store o en tiendas electrónicas, Amazon, etc.)
- PC con 2.66 GHZ de procesador o mucho más rápido con 2Gb de memoria RAM si tienes más, excelente.
- Microsoft Windows 7 en sus diferentes versiones compatible con tarjetas gráficas con Direct X 9.0c
- Microsoft Windows 7 (x86 o x64, Esto es porque KINECT solo es compatible con esta plataforma de sistema operativo).
- Microsoft Visual Studio 2010 Express o cualquier edición (http://www.microsoft.com/visualstudio/en-us/products/2010-editions/express).
- Microsoft .NET Framework 4. (http://msdn.microsoft.com/en-us/netframework/aa569263)
- Microsoft KINECT SDK. (que lo podemos descargar en este enlace http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/download.aspx)
Aca les dejo un enlace para descargar el codigo fuente y el proyecto como tal
http://www.megaupload.com/?d=6QX8U3Y8
miércoles, 17 de agosto de 2011
Diferencias entre programadores Junior, Semi Senior y Senior
Durante las últimas semanas recibí algunas consultas sobre este tema, lo que me motivó a escribir este artículo.
No es un tema de simple respuesta. Incluso buscando en Google no se encuentran respuestas maravillosas sobre el asunto.
Lo que sucede en realidad es que las diferencias entre los distintos “niveles” dependen de las necesidades y la cultura de cada organización y de cada equipo. En distintos entornos lo que diferencia a un senior de un junior puede variar.
En algunas organizaciones la diferencia solo está dada por la cantidad de años de experiencia laboral que la persona tenga, en otros casos depende del grado de conocimiento técnico y en otros está asociado a la capacidad de la persona de gestionar proactivamente su trabajo.
Lo que no tiene cuestionamientos es que se trata de una temática sumamente sensible. Habitualmente la remuneración del ingeniero de software se asocia a su nivel de seniority, así que seré lo más cuidadoso posible al presentar mis reflexiones al respecto.
En este artículo comparto algunos de los criterios que pueden ayudar a definir el nivel de seniority de una persona. Cada uno de los indicadores puede tener más o menos importancia de acuerdo a cada organización (al final del artículo incluiré una encuesta para conocer tu opinión).
Si el lector es el Gerente del equipo, le aconsejo que asigne una ponderación a cada uno de los indicadores antes de aplicarlos.
Si en cambio es un programador, mi sugerencia es que apunte a dominar todos y cada uno de los aspectos aprovechando las oportunidades que se le presenten para su desarrollo.
Si el lector es el Gerente de Recursos Humanos, mi consejo es que desarrolle un plan de carrera claro para que cada integrante de la empresa sepa qué aspectos debe desarrollar para poder aspirar al siguiente nivel de responsabilidades (y salarial, por supuesto).
Experiencia laboral
Cantidad de años de experiencia laboral en informática.
No cuentan los trabajos prácticos realizados durante sus estudios. Tampoco suma si la persona trabajó 2 años atendiendo una agencia de viajes.
Junior: Menos de 2 años de experiencia.
Semi Senior: De 2 a 6 años de experiencia.
Senior: Más de 6 años de experiencia.
Conocimientos técnicos
Principalmente referido a las herramientas, tecnologías, lenguajes de programación, paradigmas de programación, base de datos, arquitecturas, etc. que deba utilizar para cumplir sus labores.
Junior: Para desempeñarse suele requerir acompañamiento. El código que genera puede presentar mayor cantidad de bugs de lo esperado. Probablemente no maneja todas las herramientas que se necesitan para la tarea.
Semi Senior: Técnicamente autosuficiente. Puede desarrollar funcionalidades más complejas y ejecutar proyectos de mayor envergadura. Pero no es un crack y todavía comete errores “evitables”.
Senior: Es referente técnico dentro del equipo. Su conocimiento le permite colaborar en definiciones arquitectónicas y desarrollar los proyectos más desafiantes. Su código funciona, es bueno y fácil de mantener.
Conocimientos funcionales
Relacionado a los procesos, metodologías, estándares, circuitos requeridos para cumplir sus labores.
Junior: Para desempeñarse suele requerir cierto nivel de acompañamiento. No conoce todos los procesos, ni los estándares. No es experto en los temas propios del negocio.
Semi Senior: Maneja los circuitos lo suficiente como para desempeñarse. Respeta los estándares y metodologías. Conoce buena parte de los procesos del negocio.
Senior: Ayuda a definir procesos, metodologías, estándares y circuitos. Por supuesto cumple los existentes.
Proactividad
Indicando si la persona espera a que le asignen sus tarea o si por el contrario toma una actitud de mayor iniciativa.
Junior: Necesita que frecuentemente le definan su trabajo. Está a la espera del siguiente pedido. Cuando tiene tiempo libre no sabe con qué seguir. Depende de otros para avanzar con sus tareas.
Semi Senior: Se preocupa por aprovechar mejor su tiempo. Pide nuevas asignaciones cuando tiene tiempo disponible y es autosuficiente para llevar adelante una gran parte de sus tareas.
Senior: No solamente recibe requerimientos, sino que los busca y genera. En muchas oportunidades es él quien le genera asignaciones nuevas a su superior.
Seguimiento requerido
Atención que requiere de su superior inmediato.
Junior: Requiere seguimiento diario a nivel detallado.
Semi Senior: Requiere seguimiento semanal y a nivel general.
Senior: Proactivamente reporta el estado y avance de sus tareas.
Indicadores de productividad
Indicadores varios relacionados con el trabajo que realiza
Junior: Calidad: Baja/Media - Productividad: Baja/Media - Innovación: Poca o Nula
Semi Senior: Calidad: Media - Productividad: Media - Innovación: Poca
Senior: Calidad: Alta - Productividad: Alta - Innovación: Alta
Cumplimiento de fechas
Cumplimiento de las fechas de entrega pautadas. Se aplica a las tareas de análisis, desarrollos, documentación, reporting, etc.
Junior: La mayoría de las veces no cumple con sus estimaciones.
Semi Senior: A veces cumple, a veces no.
Senior: Siempre cumple. Cuando surge un desvío (inevitablemente) lo informa adecuadamente y con anticipación.
Respuesta bajo presión
Referido a situaciones extremas… no a la corrida semanal para cumplir con la fecha de entrega del siguiente release en producción.
Junior: Le pueden pasar alguna de las siguientes cosas:
- Se bloquea
- Se angustia
- Se confunde
- Se estresa
El resultado de su trabajo en una situación de presión no es bueno.
Semi Senior: Le pueden pasar alguna de las siguientes cosas:
- Se enoja
- Se defiende
- Se distancia (se borra)
- Se resigna
El resultado de su trabajo en una situación de presión a pesar de todo, es bueno.
Senior: Le pueden pasar alguna de las siguientes cosas:
- Se entusiasma
- Se compromete
- Se hace cargo
- Se inspira
El resultado de su trabajo en una situación de presión puede llegar a ser asombroso.
Relación interpersonal
(Gracias a Javier Scavino por mencionar este aspecto).
Más allá de los conocimientos y capacidades de una persona, la habilidad de comunicarse con su entorno es fundamental para su desarrollo profesional.
Junior: Puede tener dificultades para transmitir sus ideas con claridad. No logra arribar a conclusiones concretables. No siempre sabe interactuar con otras personas de forma colaborativa y profesional.
Semi Senior: Se hace entender pero no logra ganarse la simpatía ni despierta la vocación de sus colaboradores para acompañarlo en sus sugerencias. Se permite escuchar otros puntos de vista pero sigue intentando que sean sus ideas (buenas y malas) las que prevalecen.
Senior: Es bueno comunicando, pero principalmente escuchando. Puede participar en desiciones de alto nivel y colaborar si es necesario en actividades más operativas privilegiando el resultado y la calidad de las relaciones por sobre su autoría en las ideas.
Vale la pena mencionar que la misma persona puede tener características de Senior en un aspecto y de Junior en otro.
Me interesaría saber cuáles de estos criterios te parecen los más importantes a la hora de determinar el nivel de seniority de un desarrollador. En la siguiente encuesta podrás marcar hasta 3 opciones.
PHPLinq!!… una mejor forma de utilizar los datos
Language-Integrated Query (LINQ) es un conjunto de características presentado en Visual Studio 2008 y 2010 que agrega capacidades de consulta eficaces a la sintaxis de los lenguajes C# y Visual Basic. LINQ incluye patrones estándar y de fácil aprendizaje para consultar y actualizar datos, y su tecnología se puede extender para utilizar potencialmente cualquier tipo de almacén de datos.
Tradicionalmente, las consultas con datos se expresan como cadenas sencillas, sin comprobación de tipos en tiempo de compilación ni compatibilidad con IntelliSense. Además, es necesario aprender un lenguaje de consultas diferente para cada tipo de origen de datos: bases de datos SQL, documentos XML, servicios Web diversos, etc. LINQ convierte una consulta en una construcción de lenguaje de primera clase en C# y Visual Basic. Las consultas se escriben para colecciones de objetos fuertemente tipadas, utilizando palabras clave del lenguaje y operadores con los que se está familiarizado. La ilustración siguiente muestra una consulta LINQ parcialmente completada en una base de datos SQL Server en C#, con comprobación de tipos completa y compatibilidad con IntelliSense.
Ahora bien PHPLinq nos ofrece la oportunidad de ahorrar código PHP para nuestros ciclos o bucles de lenguaje como un while o un foreach. Es difícil contarlo con palabras, voy a comentarlo mejor con un ejemplo.
Ejemplo:
Digamos que tenemos una matriz de cadenas y deseamos seleccionar sólo las cadenas cuya longitud es < 5. Con PHPLinq la manera de lograr esto sería el siguiente:
$nombres = array(“John”, “Peter”, “Joe”, “Patrick”, “Donald”, “Eric”);
$resultado = from(‘$nombre‘)->in($nombres)
->where(‘$nombre => strlen($nombre) < 5‘)
->select(‘$nombre‘);
Lo ves familiar a SQL verdad? No escribirá un bucle más de esta serie, el control de la cadena de longitud, y añadiendo una variable temporal todo solucionado. Se entiende fácilmente con el ejemplo.
De todos modos acá les muestro como es la arquitectura de capas de esta librería de datos muy potente para mostrar los forma mas sencilla y dinámica.