meRobot : RaspberryPi, Nodejs & Cognitive Services (Parte 1)

Hola todos, en esta ocasión, con esta serie de tutoriales  les enseñaré como construir su propio Robot capaz de identificar y reconocer personas, inferir tu estado de animo, hablar!!! , traducir comandos de voz e incluso reconocer a tu mascota, con tan solo 50 usd, usando raspberrypi, node.js,microsoft cognitive services,machine learning  y algo de opencv. Para empezar a continuación, les comparto la lista de los   componentes de Hardware  que necesitamos para nuestro experimento : Nota:  todos los componentes se pueden adquirir en Colombia vía mercadoLibre, amazon . microelectronicos etc.

  1. Raspberry Pi camera
  2. Raspberry pi camera module 

Ok!!!, manos a la obra: Procedamos entonces a configurar nuestra raspberrypi siguiendo los pasos a continuación: Nota: Dado que las instrucciones fueron tomadas de este post : link, extiendo los créditos al autor y destaco que en mi opinión sin duda es uno de los tutoriales mas completo y detallado que he encontrado :

Instalación del SO

  1. Descargue la ultima versión de Raspbian del link oficial https://www.raspberrypi.org/downloads/raspbian/.
  2. Inserte y formatee  la microsd  sobre la cual desea instalar el sistema operativo de la raspberry (esta debe de ser de al menos 8 gb de espacio)
  3. Descargue, instale y ejecute  Etcher (cross-platform (Windows, OS X, Linux) tool for flashing images to SD cards)
  4. siga las instrucciones del asistente:etcher1
  5. haga click sobre el botón Select Image y ubique el archivo que descargo anteriormente (…zip)
  6. haga click sobre el botón Select Drive y seleccione la sd
  7. haga click sobre el botón flash, para que Etcher proceda a realizar la copia de la imagen
  8. al finalizar el proceso retire la sd de su computadora y conéctela nuevamente a la raspberry pi : https://www.youtube.com/watch?v=PCcXa4UFeLg

Configuración Inicial 

  1. conecte a la raspberry vía usb el teclado y el mouse
  2. por hdmi el monitor
  3. enciéndala conectándola a la corriente
  4. espere que el sistema operativo cargue y proceda con la configuración
  5. en el menú principal, dentro del submenu preferences haga click sobre la opción Raspberry Pi configuration
  6. luego en la siguiente ventana modifique el hostname(raspi), cambie el password por default(optional) , y lo mas importante haga click sobre el boton Expand Filesystem para asegurarnos que todo el espacio de nuestra sd quede disponible para nuestro so.
  7. en la misma ventana, en la pestaña localisation, asegúrese de modificar la zona horaria, el idioma etc.

  8. finalmente conecte la raspberry a internet 2017-02-21_12-50-38

Instalando actualizaciones 

  1. En la terminal ejecute los siguientes comandos
  • sudo apt update
  • sudo apt full-upgrade

Habilitar el acceso remoto

Si queremos acceder a nuestra raspberry de forma remota y no tener que requerir un monitor HDMI dedicado, mouse y teclado, existen diferentes formas :

  1. para acceder vía ssh, solo basta con activar el acceso desde el menú de preferences:

2017-02-21_13-05-04.jpg

  1. para acceder vía rdp/acceso remoto  o vía vnc : debemos instalar los siguientes paquetes

sudo apt install -y tightvncserver

sudo apt install -y xrdp

  1. Independientemente del protocolo que usemos para conectarnos de forma remota  a nuestra raspberry(ssh, vnc, rdp), debemos hacerlo a través de la dirección ip estática que le tengamos asignada  o la ip dinamica que el dhcp le defina, pero que pasa si queremos hacerlo usando el hostname, para eso debemos instalar samba, ejecutando el comando a continuación:

sudo apt install -y samba

ya con esto, si estamos conectados en nuestra maquina a la misma red wifi que la raspberry, podremos hacerle un  ping usando su hostname para probar si hay conexión:

2017-02-21_13-28-58.jpg

Instalación de la cámara

Finalmente para instalar la cámara podemos seguir las instrucciones del siguiente  vídeo :


Estos es todo por el momento en el siguiente vídeo les mostrare como instalar nodejs y como configurar samba para poder crear un directorio compartido que podamos acceder desde visual studio code. Espero les sea de utilidad!

Anuncio publicitario

OpenCV Notes: (3. Depuración usando Visual Studio Image Watch)

existen diferentes librerías para trabajar  procesamiento de imágenes en Internet,  la mayoría open source, sin embargo dentro de la comunidad de desarrolladores, Opencv es sin duda la mas usada. Dicha librería se puede usar para construir aplicaciones en python, java,C++ e incluso .Net usando Emgucv, casi que para cualquier plataforma y sistema operativo  (linux, Window, android,Mac OS); cuenta con una comunidad de alrededor de 47000 personas en todo el mundo, con más de 7 millones de descargas y es usada por grandes empresas del sector como Google, Yahoo, Microsoft, Intel, IBM, Sony, Honda, Toyota y algunos start ups como Minds, VideoSurf, y Zeitera.

En cuanto a IDE’s(Entornos de desarrollo) que soporten Opencv, también hay gran variedad, Los mas usados son : Eclipse, Netbeans y Visual Studio; de mi experiencia puedo decir que el mas completo es el ultimo, dado que cuenta con un gran set(conjunto) herramientas para construir, depurar y distribuir aplicaciones en C++.

Una de las tareas mas tediosa cuando se están manipulando imágenes programáticamente, es su depuración, en ocasiones se vuelve complejo realizar el seguimiento de la imagen y visualizar que transformaciones va experimentando en cada una de las etapas del procesamiento. Lo que generalmente se hace es mostrar la imagen luego de que se le ha aplicado algún algoritmo (para evidenciar sus cambios), pero esto puede causar de que nos saturemos de ventanas mostrando la imagen original, luego la misma convertida a escala de grises, la mascara, el background y el foreground etc. esto varia de acuerdo al propósito de la aplicación.

Consciente de esto Microsoft libero un plugin para visual studio, llamado Image Watch  el cual nos permite visualizar las imágenes cargada en memoria en tiempo de depuración, lo que puede ser de gran utilidad para identificar errores(bugs), chequear resultados, o simplemente tratar de entender un algoritmo o pieza de código en particular, dicho plugin es compatible con las ultimas versiones, a partir de la 2012 y lo pueden descargar del siguiente link : Image Watch Plugin, es completamente gratuito.

Finalmente  dejo un vídeo  del plugin en acción:

2016-11-12_20-34-03

Vídeo:

Espero les sea de utilidad!

 

OpenCV Notes (2. Tipos de datos)

OpenCV nos brinda apoyo a la hora de realizar cálculos matemáticos, tales como:  resolución de ecuaciones, integrales, sumatorias, operaciones entre matrices etc., dado que pone a nuestra disposición un set de funciones, que nos facilitan enormemente este trabajo. En esta entrega del curso de desarrollo de aplicaciones con  Opencv  usando Visual Studio, haré una introducción a los tipos de datos mas usados en Opencv y a algunas funciones muy útiles al momento de implementar algoritmos complejos (usando C++, para los otros lenguajes solo basta con chequear la documentación). sin mas preámbulos, empecemos:

Tipos de datos:

Point: puede indicar las coordenadas de un punto (un pixel) en una imagén o la posición de una región(Rect) dentro de la misma, miremos entonces como se usa:

Código C++:


//puntos 2d
 int x = 0;
 int y = 0;
 Point pt(x, y);//(x,y)
 Point pt2 = Point(100, 100);
 Point pt3;
 pt3.x = 200;
 pt3.y = 300;

//puntos 3d
 Point3d pt3d = Point3d(100, 200, 300);//(x,y,z)
printf("( %d , %d , %d ) \n", int(pt3d.x), int(pt3d.y), int(pt3d.z));

 //variantes
 Point2f a(2.5, 6.5); //datos float
 Point2f b(233.533, 3333336.53); //datos double
 Point3i c(100, 100, 100);//datos int
 Point3f d(23.7, 56.9, 56.00);//datos float

Size: Sirve para indicar o representar el tamaño de una región de pixeles en ancho y alto.

Código C++:


 Size dimensiones(800, 600);
 Size dimensiones2 = Size(1024, 780);
 Size dimensiones3;
 dimensiones3.width = 200;
 dimensiones3.height = 200;

 printf("(%d x %d) \n", dimensiones.width, dimensiones.height);
 printf("area de la region: %d \n", dimensiones.area());

Rec: A través de esta clase podemos definir regiones rectangulares dentro de una imagen, indiciando el ancho, el alto y su posición espacial en pixeles.

Código C++:


 Rect region = Rect(0, 0, 200, 200); // x : 0, y : 0, width: 200px, height: 200px
 Rect region2 = cvRect(0, 0, 200, 200);//usando la función cvRect
 Rect region4 = Rect(Point(200,200),Size(800,600));//usando las dos estructuras vistas
 //a partir de dos puntos, el primero indicará la posición y el segundo el tamaño
 Rect region5 = Rect(Point(400,500), Point(100));
 Rect region7 = Rect(region);// a partir de otro rectangulo
 //modificando sus propiedades
 Rect region6;
 region6.x = 200;
 region6.y = 400;
 region6.width = 700;
 region6.height = 800;

 printf("el area del rectangulo es %d \n", region6.area());
 printf("el rectangulo esta ubicado en la pos (%d,%d) \n", region6.x, region6.y);
 printf("el tamaño del rectangulo es (%d,%d) \n", region6.width, region6.height);

Mat : Partiendo de que una imagen, es una matriz o array bidimensional de números representada de forma digital, Opencv usa este tipo de dato para guardarlas en memoria y así poderlas manipular programaticamente. A través de esta clase podemos acceder a las propiedades de dicha imagen, como por ejemplo: su tamaño en pixeles, el número de canales, el formato en el que fue comprimida (JPG, PNG, BMP) entre otras, además, acceder de forma indexada(x,y) a la información de cada pixel. Pero que representa un pixel??. Cada pixel representa una magnitud física: Cantidad de Luz en un punto de una escena, Valor de color(cantidad de radiación en la frecuencia del rojo, verde y azul),Nivel de radiación infrarroja, rayos x etc. EN general cualquier radiación electromagnética: profundidad(distancia) de una escena en una dirección, cantidad de presión ejercida en un punto,nivel de absorción de determinada radiación etc.
Los formatos de imagen soportados por opencv son:
Windows bitmaps – *.bmp, *.dib , JPEG files – *.jpeg, *.jpg, *.jpe , JPEG 2000 files – *.jp2 , Portable Network Graphics – *.png ,WebP – *.webp , Portable image format – *.pbm, *.pgm, *.ppm , Sun rasters – *.sr, *.ras , TIFF files – *.tiff, *.tif

Veamos entonces las diferentes formas de definir una Matriz (Mat):

Inicialización de matrices 

Código C++:


 //Matriz de 4 filas y 5 columnnas, tipo CV_8U, valores permitidos 0 - 255, valor por defecto 23
 Mat A = Mat(4, 5, CV_8U, Scalar(23));

// A partir de un vector de nxm dimensiones
 float m2[3][3] =
 {
 { 2, 0, 1 },
 { 3, 0, 0 },
 { 5, 1, 1 }
 };

 float m3[3][3] =
 {
 { 1, 0, 1 },
 { 1, 2, 1 },
 { 1, 1, 0 }
 };

 Mat B(3, 3, CV_32FC1, m2); //matriz 3x3, inicializada con los valores de m2
 Mat C(3, 3, CV_32FC1, m3);//matriz 3x3, inicializada con los valores de m3
 //A partir de un vector de valores separados por coma
Mat G = (Mat_<double>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);

 Mat D = Mat::eye(4, 4, CV_64F); // matriz identidad de 4x4
 Mat E = Mat::ones(2, 2, CV_32F); //Matriz de unos de 2x2
 Mat F = Mat::zeros(3, 3, CV_8UC1);//Matriz de ceros de 3x3

 //A partir de otra matriz
 Mat H = B.clone();
 B.copyTo(H);

 Mat I = imread("C://opencv/girl.png");//a partir de una imagen

 printf("Ancho y alto (%d, %d) \n", I.cols, I.rows);
 printf("Ancho y alto (%d, %d) \n", I.size().width, I.size().height);
 printf("Numero de canales (%d) \n", I.channels());
 printf("Profundidad de pixeles (%d) \n", I.depth());
 printf("Número total de pixeles (%d) \n", I.total());

 

Operaciones aritméticas:

Código C++:


float m[3][3] =
 {
 { 2, 0, 1 },
 { 3, 0, 0 },
 { 5, 1, 1 }
 };

 float n[3][3] =
 {
 { 1, 0, 1 },
 { 1, 2, 1 },
 { 1, 1, 0 }
 };

 Mat M(3, 3, CV_32FC1, m); //matriz 3x3, inicializada con los valores de m2
 Mat N(3, 3, CV_32FC1, n);//matriz 3x3, inicializada con los valores de m3

 //Matrix entre Matrix
 Mat SUM = M + N; //suma entre dos matricez
 Mat SUB = M - N; //substracción de matricez
 Mat MUL = M * N; //multiplicación de matricez
 Mat DIV = M / N; //división de matricez

Operaciones Booleanas

Código C++:


uchar a[2][2] =
 {
 { 0, 1},
 {1 , 0}
 };

 uchar b[2][2] =
 {
 { 0, 0 },
 { 0 , 1 }
 };

 Mat A(2, 2, CV_8U, a); //matriz 2x2, inicializada con los valores de a
 Mat B(2, 2, CV_8U, b); //matriz 2x2, inicializada con los valores de b

 Mat C;
 bitwise_or(A, B, C);
 bitwise_and(A, B, C);
 bitwise_not(A, B, C);
 bitwise_xor(A, B, C);

Imprimir y recorrer Matrices 

Código C++:

uchar data[3][3] =
{
{ 3, 2, 1 },
{ 5, 3, 4 },
{ 1, 1,1 }
};

Mat R(3, 3, CV_8U, data);
int rows = R.rows;
int cols = R.cols;

//recorrer matriz
printf(" Matrix m: \n");
for (size_t i = 0; i < rows; i++) {
for (size_t j = 0; j < cols; j++) {
// Observe the type used in the template
printf(" %d ", R.at<uchar>(i, j));
}
printf("\n");
}

// imprimir matriz
cout << "R (default) = " << endl << R << endl << endl;
cout << "R (matlab) = " << endl << format(R, Formatter::FMT_MATLAB) << endl << endl;
cout << "R (python) = " << endl << format(R, Formatter::FMT_PYTHON) << endl << endl;
cout << "R (csv) = " << endl << format(R, Formatter::FMT_CSV) << endl << endl;
cout << "R (numpy) = " << endl << format(R, Formatter::FMT_NUMPY) << endl << endl;
cout << "R (c) = " << endl << format(R, Formatter::FMT_C) << endl << endl;

Sistemas de ecuaciones 

formula

Código C++:

float coef[3][3] =
{
{ 1, -3, 2 },
{ 5, 6, -1 },
{ 4, -1, 3 }
};

float results[3][1] =
{ { -3 },
{ 13 },
{ 8 }
};

Mat Coef = Mat(3, 3, CV_32FC1, coef);
Mat Results = Mat(3, 1, CV_32FC1, results);
Mat Out;

solve(Coef, Results, Out);

cout << "Sitema de Ecuaciones: " << endl << Out << endl << endl;

Otras Funciones

Código C++:

float array[3][3] =
{
{ 500, 4, 6 },
{ 8, -10, 12 },
{ 14, 1000, 18 }
};

//src : Matriz de entrada, dst: Matriz de resultados
Mat src(3, 3, CV_32FC1, array); //matriz 3x3, inicializada con los valores de m2

Mat dst;
dst = src.diag(); // extrae la diagonal de una matriz
dst = src.t(); // retorna la transpuesta de una matriz
dst = src.inv(); //retorna la inversa de una Matriz
dst = abs(src);//calcula el valor absoluto de cada elemento de una matriz
dst = sum(src);//devuelve el resultado de la suma de todos los elementos de la matriz
dst = mean(src);//obtiene la media de una matriz
dst = trace(src);//obtiene la sumatoria de los elemento de la diagonal de una matriz

//calcular la media y la desviación estandar de una matriz
Mat mean,std;
meanStdDev(src, mean, std);

sqrt(src, dst); //calcula la raiz cuadrada de cada elemento de una Matriz
log(src, dst); //calcula el logaritmo natural de cada elemento de una Matriz
pow(src,2, dst); //eleva a cualquier potencia, cada elemento de la matriz
flip(src, dst, 1); //flip vertical de una matriz
flip(src, dst, 0); //flip horizontal de una matriz

//ordenar los elemento de una matriz y obtener los indices de dichos elementos ya ordenados
cv::sortIdx(src, dst, CV_SORT_EVERY_ROW + CV_SORT_ASCENDING);
cv::sort(src, dst, CV_SORT_EVERY_ROW + CV_SORT_ASCENDING);

 

Espero les sea de utilidad….

 

OpenCV Notes(1.Configuración del entorno de desarrollo)

Hola a todos, en este primer tutorial acerca del desarrollo de aplicaciones con opencv, les explicaré como configurar y preparar su entorno de desarrollo para trabajar con C++, python y java; pero antes de empezar veamos que es OpenCV:

Opencv es una librería escrita en c y c++, de código abierto, en la cual vienen implementados alrededor de 500 algoritmos de visión artificial, machine learning, pattern recognition, clustering, robótica etc., que nos facilitan el desarrollo de aplicaciones en tiempo real, tales como sistemas de seguridad, detección facial, reconocimiento e inspección de objetos, navegación de robots etc. Originalmente desarrollada por Intel, actualmente opencv cuenta con una comunidad de casi 47000 personas alrededor del mundo y más de 7 millones de descargas, puede ser usada en Python, java, c, c++, os, Android e incluso Matlab. Una de sus grandes bondades, que sin duda vale la pena resaltar, es su integración con CUDA, esto es realmente fascinante ya que podemos tomar provecho del cómputo en paralelo para optimizar nuestras implementaciones.

Manos a la obra!!!, para empezar, necesitamos  instalar opencv en nuestra maquina de desarrollo , para ello vamos al siguiente link y descargamos la versión correspondiente a nuestro sistema operativo (copie el archivo opencv-xxx.exe en la ubicación que usted desee):http://opencv.org/downloads.html

2016-06-17_12-17-37

Al finalizar la descarga, ejecute el archivo descargado (.exe) y sigas las instrucciones del instalador como se muestra en la figura a continuación:

2016-06-17_13-33-312

  1. Haga doble click sobre el instalador de opencv, 2. Especifique en que carpeta desea descomprimir su contenido.

Al finalizar la instalación obtendremos una estructura de carpetas como la que muestra en la imagen a continuación.

2016-06-17_14-23-07

Dentro de la carpeta build (1), vienen los binarios de la libreria(para cada lenguaje c++, java, python) y en la carpeta source(2) el código fuente

Necesitamos crear una variable de entorno para OpenCV, esto lo podemos hacer desde una terminal ejecutando el comando:

SETX <nombre de la variable de entorno> «%CD%»

2016-06-19_10-36-31.png

%CD% significa que el valor de dicha variable, es el path actual, lo que quiere decir que como resultado, nuestra variable de entorno quedaría de la siguiente forma:

OPENCV_DIR_2_4 =»C:\Users\henry\Documents\opencv-development\opencv2.4\opencv\build»

procedamos entonces a crear nuestro proyecto en visual studio, siguiendo la secuencía de imagenes a continuación:

 

image_thumb.png

image_thumb.png

  1. Seleccione Visual C++ como lenguaje
  2. “Win 32” como template
  3. “Win 32 Console Application” como tipo de proyecto
  4. defina el titulo del proyecto
  5. especifique en que folder desea guardarlo
  6. haga click sobre el boton ok
  7. siga el asistente

image.png

image_thumb.png

Visual studio IDE

image.png

1. Property Manager: desde el property Manager Panel, podemos crear diferentes Property Sheet (perfiles de configuración), una property Sheet es un archivo xml de ext .props (Property Sheets) en donde quedan guardados los cambios a nivel de configuración que hagamos sobre nuestro proyecto. por ejemplo las variables de entorno, el path en donde estan la libererias etc.

En nuestro caso en particular, debemos especificar en las propiedades del proyecto cual es el path  en donde esta instalado OpenCV para poder referenciar desde nuestro codigo,   los archivos de encabezado de  la libreria (#include <cv.h>) y los archivos .lib (lo cúal es necesario para poder compilar y ejecutar nuestro proyecto con exito), esto cada vez  que vayamos a crear un nuevo proyecto,  demasiado dispendioso no?, por lo tanto, para evitar estar repitiendo estos pasos, podemos crear  un property sheet para guardar todos los cambios a nivel de configuración, y con solo importarla en nuestros futuros proyectos vastaría. En un mismo proyecto podemos cargar más de una property sheet, esto por si tenemos muchas versions de OpenCv instaladas.  A continuación veremos como crear un property sheet.

2. Work Area: nos permite visualizar y editar nuestros archivos de código fuente.

3. Solution Explorer: nos permite visualizar la estructura de nuestro proyecto.

Crear un property Sheet

image_thumb.png

  1. Crear una nueva property Sheet (1)
  2. Cargar una property Sheet ya existente (2)

Para el ejemplo yo le llame a la property sheet opencv2.4

2016-06-17_15-48-48

  1. Nombre de la property sheet (1)
  2. ruta donde quedará guardada nuestra property sheet (2)

Configuración del proyecto

2016-06-19_9-40-42

 

  1. Abrimos la property sheet creada en el paso anterior (1)
  2. en el cuadro de propiedades, ubicamos la sección Vc++ directories(2) y modificamos el valor de la propiedad include directories(3) (ubicación de los archivos header de opencv):

Include directories:

$(OPENCV_DIR_2_4)/include

$(OPENCV_DIR_2_4)/include/opencv

$(OPENCV_DIR_2_4)/include/opencv2

  1. guardamos los cambios (4)

2016-06-19_9-49-05

  1. Abrimos la property sheet (si la cerramos en el paso anterior) (2)
  2. en el cuadro de propiedades, ubicamos la sección Vc++ directories(2) y modificamos el valor de la propiedad Library directories(2) (ubicación de las librerias/modulos de opencv):

Library Directories:

$(OPENCV_DIR_2_4)/$(PlatformTarget)/vc12/lib

  1. guardamos los cambios

2016-06-19_9-51-22

  1. Common Properties > Linker > Input > Additional Dependencies >

opencv_calib3d2413d.lib
opencv_contrib2413d.lib
opencv_core2413d.lib
opencv_features2d2413d.lib
opencv_flann2413d.lib
opencv_gpu2413d.lib
opencv_highgui2413d.lib
opencv_imgproc2413d.lib
opencv_legacy2413d.lib
opencv_ml2413d.lib
opencv_nonfree2413d.lib
opencv_objdetect2413d.lib
opencv_ocl2413d.lib
opencv_photo2413d.lib
opencv_stitching2413d.lib
opencv_superres2413d.lib
opencv_ts2413d.lib
opencv_video2413d.lib
opencv_videostab2413d.lib

Todas las librerias estan en el directorio

$(OPENCV_DIR_2_4)/x64/vc12/lib, para 64 bits y $(OPENCV_DIR_2_4)/x86/vc12/lib para 32 bits

Descripción de los modulos de OpenCV

opencv_calib3d2413d.lib : Camera calibration and 3D reconstruction functions
opencv_contrib2413d.lib : Experimental functions (Extra modules)
opencv_core2413d.lib : Core functionality
opencv_features2d2413d.lib: 2D features framework
opencv_flann2413d.lib: Clustering and Search in Multi-Dimensional spaces
opencv_gpu2413d.lib: Cuda Support (GPU accelerated module)
opencv_highgui2413d.lib: High-Level GUI (Input,Output and User Interface)
opencv_imgproc2413d.lib: Image processing functions
opencv_legacy2413d.lib: Deprecated Stuff (old versions support)
opencv_ml2413d.lib: Machine Learning
opencv_nonfree2413d.lib: Comercial functions, The module contains algorithms that may be patented in some countries or have some other limitations on the use.
opencv_objdetect2413d.lib: Tracking and Object Detection
opencv_ocl2413d.lib: OpenCL Support
opencv_photo2413d.lib: Computational Photography
opencv_stitching2413d.lib: Image stitching
opencv_superres2413d.lib: Super resolution (Optical flow)
opencv_ts2413d.lib: 2D features framework
opencv_video2413d.lib: Video Analysis
opencv_videostab2413d.lib: Video Analysis

finalmente debemos adicionar al path, la ruta:  $(OPENCV_DIR_2_4)/$(PlatformTarget)/vc12/bin

Hello world demo (c++)

Para probar que nuestro proyecto quedo debidamente configurado, vamos a ejecutar el siguiente código (demoOpencv.cpp).

#include "stdafx.h"
#include <opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
Mat frame, raw, map;
VideoCapture camera;
int device = 0; //Device number.

camera.open(device);
if (!camera.isOpened()) {
cerr << "Failed to open video device " << device << " \n" << endl;
return 1;
}

while (true) {
camera >> frame;
if (frame.empty())
continue;

frame.copyTo(raw);
applyColorMap(raw, map, COLORMAP_JET);
imshow("map", map);

if (waitKey(30) == 27) //wait for 'esc' key press for 30ms. If 'esc' key is pressed, break loop
{
cout << "esc key is pressed by user" << endl;
break;
}

}
}

Resultado:

2016-06-19_11-25-29

Como lo mencione anteriormente, este es el primer tutorial del curso de desarrollo de aplicaciones usando OpenCV, espero les sea de utilidad

Saludos