/* filtro_suavizado.c -- filtro de suavizado
Copyright (C) 2011 Oscar García
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
Para compilar:
gcc filtro_suavizado.c -o filtro_suavizado `pkg-config --cflags --libs opencv`
*/
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
CvCapture *dispositivo = NULL;
IplImage *fotograma = NULL, *miniatura = NULL,
*trabajo = NULL, *final = NULL;
int tecla = 0, ndispositivo = CV_CAP_ANY;
/* Analizamos los parámetros de entrada */
if (argc > 2) {
printf("Uso: %s [#dispositivo]\n", (char*)basename(argv[0]));
return 1;
} else if (argc == 2) {
ndispositivo = atoi(argv[1]);
}
/* Inicializamos el dispositivo de captura y comprobamos el estado */
printf("Inicializando dispositivo de captura #%d\n", ndispositivo);
dispositivo = cvCaptureFromCAM(ndispositivo);
if (dispositivo == NULL) {
fprintf(stderr, "Error inicializando dispositivo de captura #%d\n",
ndispositivo);
return 1;
}
/* Creamos una ventana para mostrar el contenido de la webcam */
printf("Creando ventana\n");
cvNamedWindow("Fotograma", CV_WINDOW_AUTOSIZE);
/* Entramos en un bucle infinito del que saldremos al pulsar ESC */
printf("Entrando en el bucle principal (ESC para salir)\n");
while(tecla != 27) {
printf(".");
fflush(stdout);
/* Leemos un fotograma y comprobamos que la lectura haya sido correcta */
fotograma = cvQueryFrame(dispositivo);
if(fotograma == NULL) {
break;
}
/* En caso de ser la primera iteración creamos las imágenes de trabajo */
if (miniatura == NULL) {
/* La imagen final será del mismo tamaño que el fotograma completo */
final = cvCreateImage(cvGetSize(fotograma), IPL_DEPTH_8U, 3);
if (final == NULL) {
fprintf(stderr, "Error creando imagen final\n");
return 1;
}
/* La imagen en miniatura será de la mitad de tamaño */
miniatura = cvCreateImage(cvSize(fotograma->width / 2,
fotograma->height / 2), IPL_DEPTH_8U, 3);
if (miniatura == NULL) {
fprintf(stderr, "Error creando imagen en miniatura\n");
return 1;
}
/* La imagen de trabajo será de igual tamaño que la miniatura */
trabajo = cvCreateImage(cvGetSize(miniatura), IPL_DEPTH_8U, 3);
if (trabajo == NULL) {
fprintf(stderr, "Error creando imagen de trabajo\n");
return 1;
}
}
/* Escalamos el fotograma capturado a la mitad para trabajar con él */
cvResize(fotograma, miniatura, CV_INTER_LINEAR);
/* En primer lugar pegamos la miniatura en la parte superior izquierda */
cvSetImageROI(final, cvRect(0, 0, miniatura->width, miniatura->height));
cvResize(miniatura, final, CV_INTER_LINEAR);
/* Realizamos un filtrado gausiano de 1x9 (suavizado vertical) */
cvSmooth(miniatura, trabajo, CV_GAUSSIAN, 1, 9, 0, 0);
/* Y lo pegamos en la parte superior derecha de la imagen final */
cvSetImageROI(final, cvRect(trabajo->width, 0,
trabajo->width, trabajo->height));
cvResize(trabajo, final, CV_INTER_LINEAR);
/* Realizamos un filtrado gausiano de 9x1 (suavizado horizontal) */
cvSmooth(miniatura, trabajo, CV_GAUSSIAN, 9, 1, 0, 0);
/* Y lo pegamos en la parte inferior izquierda de la imagen final */
cvSetImageROI(final, cvRect(0, trabajo->height,
trabajo->width, trabajo->height));
cvResize(trabajo, final, CV_INTER_LINEAR);
/* Realizamos un filtrado gausiano de 9x9 (suavizado completo) */
cvSmooth(miniatura, trabajo, CV_GAUSSIAN, 9, 9, 0, 0);
/* Y lo pegamos en la parte inferior derecha de la imagen final */
cvSetImageROI(final, cvRect(trabajo->width, trabajo->height,
trabajo->width, trabajo->height));
cvResize(trabajo, final, CV_INTER_LINEAR);
/* Eliminamos la región para visualizar la imagen completa */
cvResetImageROI(final);
/* Mostramos la zona recortada y esperamos la pulsación de una tecla 100 ms */
cvShowImage("Fotograma", final);
tecla = cvWaitKey(100);
}
/* Antes de salir liberamos los recursos creados y/o usados */
printf("\nLiberando recursos\n");
cvDestroyWindow("Fotograma");
cvReleaseCapture(&dispositivo);
return 0;
}