Tiendas electónica Colombia
|
Implementación transformada de Fourier en c++
fourier.cpp
//transformada de furrier
// fourier.cpp
//
// Copyright 2011 mdchaparror <mdchaparror@gmail.com>
//
// 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 2 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, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
// MA 02110-1301, USA.
//
//
#include <iostream>
#include <fstream>
#include<math.h>
using namespace std;
short x[1000], f=500,j, fs=8000,i,N=1000,k,A=100;
float y[1000],frecuencia[1000],re,im;
//fs frecuencia de muestreo
//frecuencia de la señal
//N numero de muestras
//A amplitud de la señal
int main()
{
ofstream out("data.dat",ios::out |ios::binary);//creamos un flujo de salida de datos
for(i=0; i<N; i++)
{
x[i]=A*cos(6.28*f*i/fs);
if(x[i]>0) x[i]=A; //genero una onda cuadrada de frecuencia f
else x[i]=-A;
}
//algoritmo ftt
for(k=0; k<N; k++)
{
re=0;
im=0;
for(i=0; i<N; i++)
{
re=re+x[i]*cos(6.28*i*k/N);
im=im+x[i]*sin(6.28*i*k/N);
}
re=re/N;
im=im/N;
y[k]=sqrt(re*re+im*im);
}
//fin algoritmo fft
j=0;
for(i=1; i<N/2; i++)
if(y[i]>y[j])j=i;
j=j*fs/N;//frecuencia proncipal
cout<<j;
//saco vectores a archivo data.dat
for(i=0; i<N; i++)
{
frecuencia[i]=i*fs/N;
out<<x[i]<<"\t"<<frecuencia[i]<<"\t"<<y[i]<<endl;
}
return 0;
}
Este programa genera un archivo “data.dat” donde están los vectores de la señal de entrada y de la transformada de Fourier aplicada a dicha señal, graficaremos estos vectores con ayuda de Octave o Matlab
plot_octave.m
N= 1000;
fs= 8000
load data. dat
plot(data (:, 1))
axis([0,N/ 4,- 150, 150])
grid on
title("Senal de entrada" )
print ("entrada. png", "-dpng" );
figure
plot(data (:, 2),data (:, 3))
axis([0,fs/ 2])
grid on
title("Salida transformada de Fourier" )
print ("salida. png", "-dpng" );
señal de entrada:

Salida:

Como se puede observar en la imagen de salida existen picos en la frecuencia fundamental y en el tercer, quinto, séptimo armónico como era de esperarse.
El siguiente código muestra como detectar rostros en una imagen ayudándonos de un archivo de clasificación de rostros “haarcascade_frontalface_alt2.xml” el cual viene con las librerías de OpenCV.
face.cpp
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <iostream>
int main( int argc, char** argv ) {
CvHaarClassifierCascade *cascade_f;
CvMemStorage *storage;
int i=0;
/* cargamos el archivo para clasificar caras*/
cascade_f = (CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_alt2.xml", 0, 0, 0);
storage = cvCreateMemStorage(0);
cvNamedWindow( "imagen", CV_WINDOW_AUTOSIZE ); // Con el Tamaño Automatico de la imagen
IplImage* frame;
frame=cvLoadImage( argv[1] );//cargamos la imagen
CvSeq *faces = cvHaarDetectObjects(frame, cascade_f, storage,1.1, 3, 0, cvSize(10, 10 ) );
i=faces->total;
while(i--){ //cramos rectangulos alrededor de cada rostro en la imagen
std::cout<<i<<endl;
CvRect *r = (CvRect*)cvGetSeqElem(faces, i);
cvRectangle(frame,cvPoint(r->x, r->y), cvPoint(r->x + r->width, r->y + r->height), CV_RGB(255, 0, 0), 1, 8, 0);
}
cvShowImage("imagen",frame);
cvWaitKey(0); //esperamos la pulsación de una tecla
cvReleaseImage( &frame ); // liberamos la memoria donde estaba almacenada la imagen
cvDestroyWindow( "imagen" ); // Destruir la Ventana
}
compilamos con
g++ -o face face.cpp -lcv -lhighgui
ejecutamos face pasandole como parámetro una imagen
Esta es una muestra
En el post anterior mostré como instalar las librerías OpenCV en Ubuntu 11.04, ahora crearemos dos ejemplos el primero para cargar y mostrar una imagen y el segundo para mostrar una captura de vídeo por medio de nuestra webcam.
Ejemplo1
ejemplo1.cpp
#include <opencv/highgui.h> //necesaria para mostrar ventanas
int main( int argc, char** argv ) {
IplImage* img = cvLoadImage( argv[1] );//cargamos la imagen
cvNamedWindow( "ejemplo_1", CV_WINDOW_AUTOSIZE ); //creamos una ventana
cvShowImage( "ejemplo_1", img ); // mostramos la imagen en la ventana creada
cvWaitKey(0); //esperamos la pulsacion de una tecla
cvReleaseImage( &img );// liberamos la memoria donde estaba almacenada la imagen
cvDestroyWindow( "ejemplo_1" ); //destruimos la ventana creada
}
Lo compilamos de la siguiente manera
g++ -o ejemplo1 ejemplo1.cpp -lcv -lhighgui
ejecutamos
dando como resultado

Ejemplo2 este programa muestra en una ventana capturas hechas por la webcam
#include <opencv/highgui.h>
int main(int argc, char **argv)
{
cvNamedWindow( "ejemplo_2", CV_WINDOW_AUTOSIZE );
CvCapture* capture = cvCreateCameraCapture(0);//obtenemos captura de la webcam para saber que numero poner ver /dev/videoxx siendo xx el numero de dispositivo de captura
IplImage* frame;
while(1) {
frame = cvQueryFrame( capture );
if( !frame ) break;
cvShowImage( "ejemplo_2", frame );
char c = cvWaitKey(33);
if( c == 27 ) break; // esc para salir
}
cvReleaseCapture( &capture );
cvDestroyWindow( "ejemplo_2" );
}
Compilamos
g++ -o ejemplo2 ejemplo2.cpp -lcv -lhighgui
ejecutamos
OpenCV (Open Source Computer Vision Library) son una serie de librerias (mas de 500) multiplataforma para el tratamiento de imágenes, especialmente para aplicaciones de visión por computador en tiempo real.
Licencia de tipo BSD
Instalación OpenCV (Ubuntu 11.04)
En esta pagina podemos encontrar los paso para la instalación http://www.samontab.com/web/2011/06/installing-opencv-2-2-in-ubuntu-11-04/ los cuales son los siguientes
Dependencias:
sudo apt-get install build-essential libgtk2.0-dev libjpeg62-dev libtiff4-dev libjasper-dev libopenexr-dev cmake python-dev python-numpy libtbb-dev libeigen2-dev yasm libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev
Compilar e instalar ffmpeg
1 2 3 4 5 6 7
| cd ~
wget http://ffmpeg.org/releases/ffmpeg-0.7-rc1.tar.gz
tar -xvzf ffmpeg-0.7-rc1.tar.gz
cd ffmpeg-0.7-rc1
./configure --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libxvid --enable-x11grab --enable-swscale --enable-shared
make
sudo make install |
Compilar e instalar OpenCv v2.2
1 2 3 4 5 6 7
| cd ~
wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.2/OpenCV-2.2.0.tar.bz2
tar -xvf OpenCV-2.2.0.tar.bz2
cd OpenCV-2.2.0/
cmake -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=OFF -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON .
make
sudo make install |
Configuramos opencv.conf
sudo gedit /etc/ld.so.conf.d/opencv.conf
Agregamos la siguiente linea a opencv.conf
Cargamos las librerías
Abrimos el archivo /etc/bash.bashrc
sudo gedit /etc/bash.bashrc
y agregamos las siguientes lineas al final del archivo
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
Si usamos Python podemos configurarlo así:
sudo cp /usr/local/lib/python2.7/site-packages/cv.so /usr/local/lib/python2.7/dist-packages/cv.so
Si queremos compilamos los ejemplos
cd ~/OpenCV-2.2.0/samples/c
chmod +x build_all.sh
./build_all.sh
Muchas veces, algunas aplicaciones especificas nos obligan a usar Windows (aunque no nos guste) y es necesario usar herramientas desde consola. El problema viene cuando estamos acostumbrados a usar comandos Linux, y los comandos Windows no funcionan, así que es necesario aprender un nuevo conjunto de comandos para Win, pero… que tal si existiera uan herramienta para la gestión de los elementos que necesitemos desde el cmd (consola de windows) pero con los comandos Windows (e incluso herramientas Linux). Pues bien, esta herramienta si existe, de hecho existen varias, pero para este post mostraremos una que se considera muy útil. Su nombre es Cygwin y está disponible para su descarga fácilmente via web.
Step by Step:
1. Buscar en google el sitio de descarga oficial:

2. Ir a la página oficial de cygwin:

3. Hacemos click en “setup .exe” y lo descargamos dentro del directorio: c:\cygwin

4. Guardamos el archivo y lo ejecutamos:

5. Seleccionamos la opción que usaremos, aunque la recomendada es “download from internet” esto quiere decir que cada package será descargado desde inernet.

6. Seleccionamos For all users y Seteamos el lugar donde se instalará, generalmente es C:\cygwin así:


7. Seleccionamos el tipo de conexión, si hay servidor proxy ó algo similar, luego seleccionamos mirror, es decir, el servidor remoto desde donde serán descargados los packages (que pueden ser binaries o sources).

8. Seleccionamos los packages que deseemos, existen editores como nano, vi… etc, servers como apache, herramientas de desarrollo para gnome etc, compiladores gcc, gpp… etc incluso interpretadores como python, perl etc… son su documentación y con sus fuentes naturalmente.

9. Click en Next (como generalmente se debe hacer en un entorno Ruindows)… esperamos que descarguen los packages del servidor seleccionado:

10. Para remover un packages ó adicionar uno nuevo, debemos hacer click nuevamente en el archivo “setup.exe” en el directorio de instalación de cygwin. Para correr la consola Linux-Like hacemos click en el archivo .bat que aparece en el directorio de instalación:

Repito, para correr todo lo q se instaló, click en el .bat del directorio de instalacion.
Tip: si usted necesita un cmd común y corriente, desde el bash de cygwin escriba cmd y listo… este está linkeado al path de Ruindows.
Enjoy … (Thanks to GLUN, Universidad Nacional de Colombia, Open source, Openmind Open World!!, sdsanchezm)
|
|