Máxima resolución de webcam en OpenCV

Desde que comencé a usar ordenadores allá por 1992 (😱), siempre me pareció que el lado más oscuro e incomprensible de la informática se llamaba impresoras. Esta opinión cambió ligeramente desde que añadimos soporte para webcams en nuestras aplicaciones; ¡ahora hay un segundo lado oscuro e incomprensible! Cada webcam es, como se dice coloquialmente, de su padre y de su madre, con ajustes y especificaciones propios y casi únicos. Para poner peor las cosas, OpenCV (la biblioteca por antonomasia para procesamiento de imágenes) es bastante básica, o mejor dicho, genérica, en cuanto a captura de vídeo se refiere. En este artículo nos ocuparemos de un aspecto en específico: las resoluciones soportadas, o mejor dicho, la máxima resolución que una …

Sigue leyendo →

Atributo maybe_unused (C++17)

En algunos ejemplos mostrados en entradas anteriores ha aparecido el uso del atributo [[maybe_unused]] que igual no os suena aún. Los atributos son una característica del C++ moderno que permiten indicar al compilar información acerca del código, con el fin de optimizar determinados fragmentos, introducir restricciones o generar el código de una forma específica. Los atributos vienen a unificar alternativas ya existentes pero que eran propias de cada compilador, generando código no portable u obligando a usar macros y detección del compilador. Una lista completa de los atributos de C++ puede encontrarse en cppreference.com.

En nuestro caso, [[maybe_unused]] es un atributo introducido en C++17, que indica al compilador que no genere warnings de no-uso para el identificador asociado. Esto …

Sigue leyendo →

Iterando sobre QMaps

Los que trabajáis normalmente con Qt me entenderéis la siguiente expresión: en lo que respecta a contenedores de datos (bueno, y en muchos otros también), Qt es casi un lenguaje propio, sigue su propia filosofía y adapta C++ a ella. Por ejemplo:

  • Uso extensivo del COW (Copy-On-Write) para reducir la carga asociada a la copia de objetos.
  • Compatibilidad parcial con los contenedores de la biblioteca estándar y sus algoritmos (por ejemplo, el método size de todos los contenedores Qt devuelve un entero con signo, en lugar de un size_t como hacen los contenedores estándar). Esto se ve además en cantidad de métodos duplicados para ser compatibles con algoritmos de la biblioteca estándar (véase QList::push_back y QList::append).
  • Compatibilidad

Sigue leyendo →

Correspondencia de monitores entre Qt y Windows

Hace poco modifiqué el módulo de splash screens (en Qt) para mostrar la imagen en el mismo monitor en el que se mostraría la aplicación. Esto implica conocer en qué monitor se va a mostrar la aplicación, calcular el tamaño del escritorio, escalar la imagen, entre otras.

Qt ofrece una forma muy amigable de solicitar información sobre las pantallas disponibles mediante QApplication::screens(), la cual devuelve una lista de QScreens desde donde podemos consultar datos como la resolución y el factor de escala, por lo que los requisitos de dimensionado estaban cubiertos: sólo quedaba por conocer el monitor en el que se iba a mostrar la aplicación.

Nótese que este módulo se usa tanto en aplicaciones creadas en Qt como …

Sigue leyendo →

Cómo montar una carpeta local como unidad en Windows

Llevo un par de años trabajando a distancia y, aunque no pretendo abrir un especial de teletrabajo, me gustaría compartir un pequeño cambio que hice en mi sistema para ajustarme mejor a esa situación y poder agilizar mi día a día. No es ningún secreto pero igual ayuda a los que hayáis tenido que cambiar al remote working.

Nuestro flujo de compilación incluye trabajar continuamente con repositorios (en donde se ven los beneficios de usar un sistema de control de versiones distribuido como Git), y descargar datos desde unidades de red, las cuales tenemos montadas como discos. Además, nuestro día a día incluye consultar continuamente ficheros en dichas unidades. Todos estos accesos pueden llegar a ser bastante más lentos …

Sigue leyendo →

[Nano-post] Qt, moc y cabeceras precompiladas

Si vuestro proyecto Qt presenta las siguientes características (todas):

  • usa cabeceras precompiladas,
  • se compila en Visual Studio,
  • y usa compilación basada en Qt / MSBuild

podéis encontraros con que los ficheros generados por la herramienta de moc’ing de Qt no compilan correctamente al no encontrar el fichero stdafx.h (o pch.h, o cualquiera sea el nombre de vuestro fichero de cabeceras precompiladas).

Recordad que estos ficheros _ moc’eados_ los genera Qt para ficheros (normalmente) .h que incluyen una clase con la macro Q_OBJECT, así se genera el fichero moc_Header.cpp para el fichero Header.h.

Es posible solucionar este problema fácilmente entrando en la configuración de los ficheros de cabecera y forzar la inclusión del fichero de cabecera precompilado:

Sigue leyendo →