Renato Garcia

Visualizando Imagens OpenCV no GDB

Ao se debugar um programa usando o GDB ou qualquer outro debugador, se uma determinada variável representar uma imagem, inspecioná-la simplesmente imprimindo seu conteúdo como uma sequência de números ou caracteres não é lá de muita utilidade.

../../media/img/woman_in_red_bin.png

A não ser que você esteja vendo uma mulher de vermelho, o resultado acima não deve ter lhe acrescentado muita informação sobre o estado da variável matImg.

Uma alternativa um pouco melhor do que simplesmente imprimir uma imagem como uma sequência de bytes, seria uma variação de printf debugging. Usando as funções da biblioteca OpenCV como exemplo, o código abaixo irá exibir em uma janela a imagem que está na variável mat, e esperar até que uma tecla qualquer seja pressionada.

cv::imshow("window", mat);
cv::waitKey();
C++

É simples, funciona, mas possui todas as mesmas desvantagens da técnica de printf debugging tradicional. A solução ideal seria obter o mesmo resultado acima, mas através de um comando interno do GDB.

Tentando não acabar reinventando a roda sem saber, depois de um tempo de pesquisa encontrei uma extensão para o GDB, criada por Stefano Pellegrini, que fazia boa parte do que eu desejava para objetos do tipo cv::Mat. Beleza! Partindo dessa versão, acrescentei suporte para IplImage, ROIs, alguns outros detalhes, e tenho agora uma forma bem razoável de debugar programas que usam imagens da OpenCV.

../../media/img/48072cfb-aa5f-4624-8d73-c0f2d69a33ad_2.png

Uma vez a extensão instalada, haverá um novo comando do GDB que exibirá a imagem em uma janela.

Esta extensão irá registrar um novo comando, cv_imshow, que recebe como argumento uma variável contendo a imagem que deverá ser exibida. A princípio cogitei usar o mecanismo de pretty printing ao invés de criar um novo comando, mas não teria sido a melhor decisão. Mesmo restrito aos tipos de imagem da OpenCV, nem todos os formatos são passíveis de serem exibidos. Portanto ainda é útil que se tenha ao menos o comando de print tradicional do GDB, como um último recuso para inspecionar uma variável caso ela não possa ser inspecionada graficamente.

O código fonte, juntamente com todas as instruções para compilar e instalar a extensão podem ser encontrados (em inglês) no repositório github do projeto.