Categories

Tiendas electónica Colombia

Transformada de Fourier c++

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.

Detectar rostros usando OpenCV

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

./face imagen.jpg

Esta es una muestra

original salida

Hola mundo OpenCV

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

./ejemplo1 tux.png

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

./ejemplo2

Librería OpenCV sobre Linux

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

/usr/local/lib

Cargamos las librerías

sudo ldconfig

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

Comandos Linux desde Windows

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:

 step cygwin

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

2 step cygwin

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

3 step cygwin

4. Guardamos el archivo y lo ejecutamos:

5 step cygwin

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í:

9 step cygwin

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).

9 step cygwin

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.

11 step cygwin

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

12 step cygwin

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:

13 step cygwin

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)