Hola a todos, estuve leyendo y no hay ni un tema que hable sobre procesamiento de imagenes.
Alguien sabe si existe algún foro sobre este tema?
bueno para los que saben de C++, les cuento que estoy usando una dll creado por un colega (ingenieria electronica), esta dll tiene varias rutinas de procesamiento de imagenes y no puedo entender para que sirven algunos comandos o como hace para leer los bytes de rojo verde y azul de cada pixel de la imagen usando los lpbits.
Aqui les presento una rutina, esta rutina detecta los contornos d ela imagen toma una foto de 360*240 pixeles en formato *.BMP y le aplica un filtro teniendose como resultado la misma imagen.
Esta rutina tambien utiliza dos rutinas que están contenidas en la misma dll que son:
CargarImg(hwnd, hdc): Carga la imagen previamente guardada, por ejemplo en una ventana de visual basic.
DibImg(hdc): Presenta la imagen resultante en una ventana de visual basic.
Estas 2 funciones tambien se las agrego a continuación
Por favor si alguien tiene el tiempo de explicarme como funcionan estas rutinas se los agradecería muchisimo.
Si alguien desea el codigo entero o la dll, me la pide y se la nvio.
Gracias
Alguien sabe si existe algún foro sobre este tema?
bueno para los que saben de C++, les cuento que estoy usando una dll creado por un colega (ingenieria electronica), esta dll tiene varias rutinas de procesamiento de imagenes y no puedo entender para que sirven algunos comandos o como hace para leer los bytes de rojo verde y azul de cada pixel de la imagen usando los lpbits.
Aqui les presento una rutina, esta rutina detecta los contornos d ela imagen toma una foto de 360*240 pixeles en formato *.BMP y le aplica un filtro teniendose como resultado la misma imagen.
Esta rutina tambien utiliza dos rutinas que están contenidas en la misma dll que son:
CargarImg(hwnd, hdc): Carga la imagen previamente guardada, por ejemplo en una ventana de visual basic.
DibImg(hdc): Presenta la imagen resultante en una ventana de visual basic.
Estas 2 funciones tambien se las agrego a continuación
Por favor si alguien tiene el tiempo de explicarme como funcionan estas rutinas se los agradecería muchisimo.
Si alguien desea el codigo entero o la dll, me la pide y se la nvio.
Gracias
Código:
// determinacion de contorno usando convolución
void Edge(HWND hwnd,HDC hdc)
{
int m[9]; //vector para almacenar valores de la matriz a convolucionar
CargarImg(hwnd, hdc);
hmem1 = GlobalAlloc(GHND, bm.bmWidth*bm.bmHeight);//solicitud de memoria
lpLum = (LPBYTE)GlobalLock(hmem1);
hmem2 = GlobalAlloc(GHND, bm.bmWidth*bm.bmHeight);//nueva solicitud de memoria
lpAux = (LPBYTE)GlobalLock(hmem2);
for (i=0; i<=(int)(bmi.bmiHeader.biSizeImage-3); i=i+3)
{
blue=lpBits[i];
green=lpBits[i+1];
red=lpBits[i+2];
lum=(int)(0.3*red+0.59*green+0.11*blue);
lpLum[i/3]=(BYTE)lum;
}
for (i=0;i<=(int)(bm.bmWidth*bm.bmHeight-1);i++)
{
if(((i)%bm.bmWidth!=0) & ((i+1)%bm.bmWidth!=0) &
(int(i/bm.bmWidth)!=0) & (int(i/bm.bmWidth)!=(bm.bmWidth-1)))
{
m[0]=lpLum[i-(bm.bmWidth+1)];// se cargan lso valores
m[1]=lpLum[i-(bm.bmWidth)];// de la submatriz de imagen
m[2]=lpLum[i-(bm.bmWidth-1)];// que se procederá
m[3]=lpLum[i-1];// a convolucionar
m[4]=lpLum[i];// con la matriz de convolución
m[5]=lpLum[i+1];//este procedimiento se hace para toda
m[6]=lpLum[i+(bm.bmWidth-1)];// la imagen y se desplaza
m[7]=lpLum[i+(bm.bmWidth)];// esta matriz un pixel cada
m[8]=lpLum[i-(bm.bmWidth+1)];// oportunidad
// la ecuació del algoritmo es:
lpAux[i]=(BYTE)(abs(m[4]*8-m[0]-m[1]-m[2]-m[3]-m[5]-m[6]
-m[7]-m[8]));
}
else
{
lpAux[i]=(BYTE)0;
}
}
for (i=0; i<=(int)(bmi.bmiHeader.biSizeImage-3); i=i+3)
{
lpBits[i]=lpAux[i/3];
lpBits[i+1]=lpAux[i/3];
lpBits[i+2]=lpAux[i/3];
}
GlobalUnlock(hmem1);
GlobalUnlock(hmem2);
DibImg(hdc);
}
void CargarImg(HWND hwnd, HDC hdc)
{
GetClientRect(hwnd, &rect);
// Obtiene dimension de la imagen a procesar,
// no incluye bordes de ventana.
hdcaux=CreateCompatibleDC(hdc); // crea ventana virtual
hbm=CreateCompatibleBitmap(hdc, rect.right, rect.bottom);
SelectObject(hdcaux, hbm);
// Copia imagen origen de VB en ventana virtual y lo almacena en el
// bitmap creado con hbm.
BitBlt(hdcaux, 0, 0, rect.right, rect.bottom, hdc, 0, 0, SRCCOPY);
// Obtine información acerca de las características del bitmap virtual
// y las guarda en una estructura de tipo BITMAP, bm.
//Sizeof, determina la cantidad de bytes de la estructura del BITMAP.
GetObject(hbm, sizeof(BITMAP), &bm);
bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);//bmi
bmi.bmiHeader.biWidth=bm.bmWidth;
bmi.bmiHeader.biHeight=bm.bmHeight;
bmi.bmiHeader.biPlanes=1;
bmi.bmiHeader.biBitCount=24;// guarda el color en formato de 24 bits
bmi.bmiHeader.biCompression=0;
bmi.bmiHeader.biSizeImage=(bm.bmWidth*bm.bmHeight*3);
bmi.bmiHeader.biClrUsed=0;
bmi.bmiHeader.biClrImportant=0;
hmem = GlobalAlloc(GHND, bmi.bmiHeader.biSizeImage);
// Petición de memoria al sisitema para almacenar información
// del color de la imagen
lpBits = (LPBYTE)GlobalLock(hmem);
// define vactor del tamaño de memoria reservado anteriormente
GetDIBits(hdcaux, hbm, 0, rect.bottom, lpBits, &bmi, DIB_RGB_COLORS);
// carga en lpbits información obtenida mediante escaneo por lineas
// de la imagen virtual en formato RGB.
}
// rutina para dibujar resultados en un mapa de bits
void DibImg(HDC hdc)
{
hdcnew=CreateCompatibleDC(hdc);
//crea dispositivo de contexto compatible
hbmnew=CreateCompatibleBitmap(hdc, bm.bmWidth, bm.bmHeight);
//crea dispositivo de contexto compatible con bitmaps
SelectObject(hdcnew, hbmnew);
SetDIBits(hdcnew, hbmnew, 0, bm.bmHeight, lpBits, &bmi, DIB_PAL_COLORS);
//Copia color de un bitmap indep de dispositivo
BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcnew, 0, 0, SRCCOPY);
GlobalUnlock(hmem);
DeleteDC(hdcnew);
DeleteDC(hdcaux);
}
Última edición por un moderador: