Ros Hydro + OpenCV – Fusionar dos imagenes con diferentes tamaños

Parto de la idea de que las referencias a OpenCV están cargadas, por lo que sólo hace falta escribir el código.

En mi caso, más que fusionar dos imágenes de diferentes tamaños partiendo de dos ficheros, me interesaba saber cómo añadir un logo a las imágenes capturadas por la Kinect (Webcam o lo que toque). Un error que he estado cometiendo era intentar cargar la imagen del logo en la función callback, que se ejecuta cuando hay una nueva imagen de Kinect en el topic camera/depth_registered/points. Si la carga del logo se hace en la función main(), entonces funciona correctamente.

En la función main(), por tanto, cargamos la imagen con el logo, que en este caso tiene un tamaño de 150×50 píxeles, y comprobamos a continuación si se ha cargado. En caso de no cargarse la imagen se muestra por consola un texto informativo. También creamos la ventana en la que se mostrará el resultado final.

logo = cv::imread("/home/ikarus/nombre.jpg", CV_LOAD_IMAGE_COLOR);

if (!logo.data)
{
    printf("No se ha cargado la imagen.");
}

cvNamedWindow("monocolor", 1);

En mi caso, como quiero añadir un logo a las imágenes capturadas por la Kinect, primero convierto el flujo de datos de Kinect a un objeto cv::Mat de tres canales para poder trabajar con él. Hay que hacer esta conversión debido a que la nube de puntos devuelta por Kinect incorpora, además de los colores por pixel, otra información como la distancia a la que se encuentra ese punto, obtenida mediante su sensor de infrarrojos. En mi caso, el objeto de tipo cv::Mat sobre el que expondremos el logo se llama original, como resultado de guardar en esta matriz los colores de los píxeles del fotograma i-esimo.

Lo que se debe hacer para incrustar el logo es crear una estructura de tipo rectángulo, que será nuestra región de interés sobre la que poner el logo. Contendrá un punto de inicio (par x-y),  y un tamaño (longitud en columnas y filas). La crearemos mediante la función cv::Rect(pos_x, pos_y, long_columnas, long_filas). Después, clonamos la imagen original (cv::Mat original) que mostraremos al final del todo con el logo. Obtenemos de la imagen original la región de interés (ROI). Hacemos lo mismo con la imagen clonada. Por último, utilizando la función cv::addWeighted(imagen1, peso_imagen_1, imagen2, peso_imagen_2, salida_imagen) hacemos la mezcla de ambas imágenes, guardando el resultado en la estructura que le indicamos al final (salida_roi).

cv::Rect roi = cv::Rect(490, 10, logo.cols, logo.rows);
cv::Mat salida = original.clone();
cv::Mat imageRoi = original(roi);
cv::Mat salida_roi = salida(roi);
cv::addWeighted(imageRoi, 1.0, logo, 0.3, 0.0, salida_roi);

Ahora, mostramos el resultado final.

cv::imshow("monocolor", salida);

Logo

Ros Hydro + Kinect + Ubuntu 12.04

Este post es un recordatorio para mi yo del futuro cuando quiera volver a instalar Ros y usar la Kinect sobre Ubuntu 12.04.

Para la instalación de Ros, nada mejor que seguir el manual del propio Ros:

http://wiki.ros.org/hydro/Installation/Ubuntu

Una vez instalado Ros, hay que instalar las bibliotecas Openni para poder hacer funcionar Kinect:

$ sudo apt-get install ros-hydro-openni-*

Ahora hay que quitar los módulos gspca porque, de lo contrario, no nos permitirá lanzar openni correctamente y dará fallos (por la terminal aparecerá mucho rojo, demasiado):

$ sudo modprobe -r gspca_kinect
$ sudo modprobe -r gspca_main

Ya es el momento de probar si funciona este tinglado. Primero ejecutamos Openni en una terminal para activar la Kinect y los topics.

$ roslaunch openni_launch openni.launch

Si no salen errores, desde otra terminal abrimos rviz.

$ rosrun rviz rviz

En rviz, para poder ver algo, hay que añadir los siguientes displays y configurarlos con estos topics:

  • Fixed Frame:
    • /camera_depth_optical_frame
    • /camera_depth_frame (para ver la imagen solapada con la distribución de puntos del sensor de infrarrojos).
  • Image:
    • /camera/rgb/image_color (esto nos mostrará en una ventanita la imagen a todo color de lo que esté capturando la cámara).
  • PointCloud2:
    • /camera/depth_registered/points (nos muestra la nube de puntos de los objetos que detecta el sensor de infrarrojos).

A la hora de crear un paquete, en la versión Hydro de Ros, la dependencia pcl de la versión Electric pasa a llamarse pcl_conversions y pcl_ros (yo añado ambas por si acaso). Además, la cabecera .h ya no es pcl/ros/conversions.h, sino que es pcl_conversions/pcl_conversions.h.

Rviz mostrando las capturas de Kinect.

Ejercicio coloreado puntos Kinect

Fuentes:

 


 

En el caso de que al configurar rviz no se muestren los puntos de profundidad de la imagen coloreados, es debido a que hay que configurar el driver de la Kinect. Para hacer esto abrimos una nueva terminal y ejecutamos la siguiente instrucción:

$ rosrun dynamic_reconfigure reconfigure_gui

O, en el caso de que el comando anterior no funcione, hay que ejecutar este otro (con Ubuntu 13.04 he tenido que usar este):

$ rosrun rqt_reconfigure rqt_reconfigure

Entonces, aparecerá una nueva ventana. En ella desplegamos el árbol de camera y después seleccionamos driver. Dentro de las opciones que se muestran marcamos la casilla depth_registration. En ese momento en rviz deberán aparecer los puntos de profundidad en la rejilla.

Configurar driver Kinect

 

SQL Server: Añadiendo el número de fila

Algunas veces me ha hecho falta poder filtrar registros por número de fila más que por otro campo existente en la tabla. Este método se basa en crear una tabla temporal con los registros de la consulta a realizar añadiendo una columna nueva con el número de fila, la cuál podremos utilizar en el segundo paso para filtrar los registros. Finalmente, eliminaremos la tabla temporal.

Mi consulta inicial es la siguiente:

SELECT [sequence]
FROM _smdba_._telmaste_
WHERE [lastmodified] BETWEEN '2012-06-07' AND '2012-06-08'
ORDER BY [sequence] ASC

Primer paso, modificamos la consulta inicial indicando sobre qué tabla temporal queremos volcar los resultados. Además, añadimos la columna que almacenará el número de la fila. La función IDENTITY() sólo puede ser utilizada con la cláusula INTO. Por tanto, si no la ponemos nos dará error.

SELECT IDENTITY(int, 1,1) AS numero_fila, [sequence]
INTO #temporal
FROM _smdba_._telmaste_
WHERE [lastmodified] BETWEEN '2012-06-07' AND '2012-06-08'
ORDER BY [sequence] ASC

Segundo paso, realizamos la consulta final sobre la tabla temporal.

SELECT *
FROM #temporal
WHERE numero_fila > 43000
ORDER BY numero_fila ASC

Tercer paso, eliminamos la tabla temporal.

DROP TABLE #temporal

Nota: Esto lo he realizado sobre un SQL Server 2000.

Concierto de Rammstein en el BEC

El viernes pasado (19 de Abril de 2013) fui al concierto de Rammstein que hubo en Barakaldo en el BEC (Bilbao Exhibition Center). Para mí fue mi primer concierto, nunca antes estuve en ningún otro y me pareció increíble el despliegue de luces y efectos que hubo en él. Además de la cantidad de altavoces que hubo. Aunque los efectos que más me gustaron fueron los de fuego. Desde donde estuve, que no era precisamente cerca del escenario, se podía notar el calor de las llamas.

Dejo un vídeo que grabé durante el concierto de la canción Sonne del disco Mutter, así como, unas imágenes que he sacado de otros vídeos que hice.

This slideshow requires JavaScript.

DRM y Casa del Libro

Estoy acostumbrado a comprar ebooks en Amazon, porque tengo un Kindle, o libros sin ningún tipo de DRM, lo cuál me permite poder convertirlo con Calibre de Epub a Mobi y posteriormente enviarlo a mi Kindle. El caso es que estaba echando un vistazo a los libros de informática de Casa del libro cuando he visto uno que me parecía interesante a un precio bastante suculento: Compiladores – Teoría e implementación, de Jacinto Ruiz Catalán. He leído la sinopsis y lo he comprado.

Ahora es cuando llega mi sorpresa, voy a descargarlo y sin querer le doy a leer. Automáticamente se carga el libro sobre una aplicación Web llamada Tagus, en ese momento he fruncido el ceño, no lo veía claro, aunque la idea de poder leer cómodamente el libro en el navegador Web tampoco es descabellada, es un plus.

Cargando Tagus Online

 

Tagus Online

Así que, he vuelto a mi biblioteca de libros comprados donde sólo figuran dos gratuitos y éste. Vuelvo a pulsar sobre el libro con cuidado de no darle de nuevo a leer y se despliega el menú con las opciones disponibles: Descarga en Adobe, Fin Lectura y Editar. ¿Cómo, no hay más opciones?. ¿Qué es eso de Descaga en Adobe?. Resulta que si pincho ahí se descarga un fichero que ocupa sobre 1KB, ya que no es más que un fichero XML con información para poder descargarlo desde una aplicación de Adobe: Adobe Digital Editions. El cual descarga el fichero y lo convierte a Epub.

Fichero de 1KB de la descarga Adobe

Por suerte, esta información está disponible en la propia página Web de Casa del libro (Atención al cliente > Ver preguntas frecuentes > Cómo puedo descargar un ebook > PC/ordenador o dispositivo no Tagus).

Información para descargar el libro

Entonces, me ha tocado descargar Adobe Digital Editions para Mac e instalarlo. Una vez instalado he arrastrado el fichero con extensión acsm que me he bajado de Casa del libro a esta aplicación y en unos segundos ha descargado el libro. A continuación, lo he buscado en el equipo para saber cuál era su ubicación. Ahora quedaba lo más difícil, conseguir leerlo en Kindle, ya que, este libro tiene un sistema DRM que es distinto al que Kindle soporta, por tanto, había que quitárselo, pero ¿cómo?.

Buscando el libro en formato Epub

Por suerte para mí, por desgracia para otros, he buscado con la ayuda de Google y he encontrado este artículo donde dan los pasos a seguir: http://texnical.wordpress.com/2012/03/10/acsm-ebooks-on-kindle/. Comenta su autor que hay un plugin para Calibre (herramienta que utilizo para convertir los libros en versión Epub a Mobi) que al importar el libro le quita el DRM. Esa es mi opción. Ese artículo me lleva a este otro donde se explica los distintos tipos de esquemas de DRM que hay y cómo quitarlos: http://apprenticealf.wordpress.com/2011/01/13/ebooks-formats-drm-and-you-%E2%80%94-a-guide-for-the-perplexed/. En este último artículo comentan que hay que descargarse de ese mismo blog un fichero zip que contiene el plugin para Calibre: http://www.datafilehost.com/download-22e89a8b.html. Yo, por si las moscas, lo he puesto a buen recaudo.

Una vez descargado el fichero zip y descomprimido, he iniciado Calibre e instalado el plugin siguiendo las instrucciones que indican en aquel blog:

  1. Ir a preferencias.
  2. Cambiar el comportamiento de Calibre.
  3. Ir a Avanzado y pulsar en Complementos (aparece con una ficha de puzzle verde).
  4. Cargar complemento desde un archivo. Buscamos la carpeta descomprimida que hemos descargado y en ella la que tiene como nombre DeDRM_calibre_plugin, accedemos a ella y seleccionamos DeDRM_plugin.zip y vamos pulsando los botones de añadir, aceptar y los que salgan para instalar este plugin.
  5. Ahora ya lo tenemos instalado. Cerramos Calibre para que se tengan en cuenta los cambios.
  6. Abrimos Calibre e importamos el libro en su versión Epub para que le quite el DRM de forma automática.
  7. Finalmente sólo me ha quedado convertirlo a Mobi y enviarlo por correo a mi Kindle.

Calibre

 

Leyendo el libro en Kindle para Mac

¡Menos mal que alguien ha hecho ese plugin!.

 

Fuentes:

Diálogo de película

Policía – Y vosotros, ¿qué sabéis? (refiriéndose a los informáticos)

Informático – La ide fue desviada al bios de una forma rara y el cilindro sector se almacenó en el cmos.

 

El guionista se quedó tan satisfecho por lograr meter términos super informáticos en una conversación sin sentido. Lo mejor es cuando el segundo informático descifra lo que el primer informático ha dicho: resulta que es un tema de correos electrónicos.

No he podido seguir viendo la película sin pensar en esa conversión.

Película: En la mente del asesino.    Minuto: 30,42.