2009-10-10 8 views
5

A menudo escribo código que procesa imágenes al escribir píxeles directamente en buffers y a menudo me resulta difícil obtener una buena visión general de lo que realmente está sucediendo. La ventana de Memoria en el depurador de Visual Studio es de alguna manera una ayuda, pero realmente me encantaría ver las imágenes gráficamente.Depuración de representación de imágenes en Visual C++, ¿algún complemento útil?

Así que mi pregunta es, ¿alguien sabe de una extensión de depuración que puede leer un trozo de memoria como una imagen en un formato de píxel específico y mostrarlo gráficamente?

+0

Me interesa exactamente la misma tarea. ¿Hay algún progreso en el problema? Ha aceptado la respuesta con un enlace a imdebug, pero requiere modificaciones del código fuente y contradice su propio comentario: http://stackoverflow.com/questions/1549129/debugging-image-rendering-in-visual-c-any-helpful -add-ins # comment1425286_1549543, ¿no es así? – Mikhail

Respuesta

3

Tal cosa existe:

Una utilidad para la depuración sencilla al estilo printf de imágenes en aplicaciones Win32 C/C++.

http://billbaxter.com/projects/imdebug/

Mi compañero de trabajo alabanzas sobre.

--Chris

0

He descartado mi respuesta anterior ya que era irrelevante. El nuevo también usó OpenCV (ya que estoy tratando de mostrar una imagen de OpenCV) pero se puede adaptar a cualquier marco.

El código núcleo es donde se lleva a una dirección de memoria address, y el número de bytes a leer a través de numrows, numcols, y byte_size y lee los bytes en una memoria intermedia. Estoy seguro de que puede adaptar esa parte del código para sus propias necesidades.

#include "stdafx.h" 
#include <windows.h> 
#include <cv.h> 
#include <highgui.h> 
#include <iostream> 

using namespace std; 
using namespace cv; 

void imshow_debug(const LPCVOID address, const int numrows, const int numcols, const int type, const int byte_size, const int step, const string windows_title) 
{ 
    // Initialize 
    unsigned long PID; 
    SIZE_T read_bytes = 0; 

    // Allocate space for the image 
    const int bytes_to_read = numrows*numcols*byte_size; 
    uchar *image_data = new uchar[bytes_to_read]; 
    Mat Image(numrows,numcols,type,image_data,step); 

    // Get the handle and PID 
    HWND handle = FindWindowA(0, windows_title.c_str()); 
    if (!FindWindowA(0, windows_title.c_str())) 
    { 
     printf("Window %s not found!", windows_title); 
     exit(0); 
    } 
    GetWindowThreadProcessId(handle, &PID); /* Get windows PID from a window handle */ 
    HANDLE WindowsProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, false, PID); 

    // Read the image 
    ReadProcessMemory(WindowsProcessHandle,address,image_data,bytes_to_read,&read_bytes); 
    if(bytes_to_read != read_bytes) 
    { 
     cout<<"Could not read entire image"<<endl; 
     exit(0); 
    } 

    // Display the image 
    namedWindow("Image"); 
    imshow("Image",Image); 
    waitKey(); 

    // Clean up 
    CloseHandle(WindowsProcessHandle); 
    delete[]image_data; 
} 

int main(int argc, char* argv[]) 
{ 
    imshow_debug((LPVOID)0x03af0370,300,300,CV_64F,sizeof(double),2400,"C:\\Documents and Settings\\jacobm\\My Documents\\Visual Studio 2005\\Projects\\Head\\debug\\SSR_VideoComp.exe"); 
    return 0; 
} 
+0

Pensé que era lo suficientemente claro como para que mi problema no mostrara las imágenes en algún momento, mi problema es que quiero mostrar las imágenes mientras paso un paso por el código dentro del depurador y quiero ver cómo se mueve mi puntero de escritura alrededor. Estoy buscando una extensión para el depurador que muestre lo que hace mi código mientras lo paso. – nielsm

+0

Lo siento y finalmente * he * llegado a implementarlo :) – Jacob

+0

Para la visualización de imágenes OpenCV, consulte https://sourceforge.net/projects/nativeviewer/ – Mikhail

0
  1. crear una clase que contiene el búfer + metadatos (ancho, alto, paso grande, PixelFormat).
  2. Agregue los métodos ToStream() y FromStream() a su clase para (de) serializar imágenes (búfer y metadatos).
  3. Agregue un ToWpfBitmapSource() a su clase.
  4. Crea un visualizador de depuración que deserializa tu imagen de la secuencia, convierte a BitmapSource de WPF, coloca en un control de imagen, dentro de un host Winforms WPF.

Este ejemplo ayudará: http://www.codeproject.com/KB/WPF/WPF_Glimps.aspx

La clase se puede añadir en C++ CLI en un DLL separada.

1

Un colega mío escribió este artículo CodeProject para la escritura de los visualizadores del depurador

http://www.codeproject.com/KB/showcase/BuildDebuggerVisualizer.aspx

Se utiliza nuestro producto, un conjunto de herramientas de imágenes .NET, pero podría ser fácilmente adaptado para utilizar las clases .NET imagen en su lugar.

1

Lo que están pidiendo no es naturalmente achieveable en C++ nativo. Toda la tecnología de visualización dentro del depurador visual se organiza alrededor del CLR, por lo tanto, C# o C++/CLI.

Lo único que puede ayudar en tierras nativas es el mecanismo expression evaluator addin.Por supuesto, está diseñado para devolver una cadena y desaparecer, pero es un código, por lo que en teoría podría ejecutar cualquier código, incluso mostrar una ventana y mostrar los datos que le interesan (después de haberlos leído del depurador).

Sin embargo, es un poco desagradable ver esas grandes características que faltan del lado nativo.

1

Estoy desarrollando un complemento de código abierto, Visual Image Assist, para VC6/7/8/9 usado para mostrar/editar una imagen. Puede ser que tú también quieras.

+0

¿Hay alguna actualización del proyecto? Ni siquiera está claro cómo construir la última versión. – Mikhail

+0

No lo había desarrollado ahora. Lo he transferido a mi colega. Si él y yo tenemos tiempo, lo mejoraremos. –

Cuestiones relacionadas