Tutorial 2

Embed Size (px)

Citation preview

Introduo a Processamento de Imagens e Viso Computacional usando OpenCVTutorial 2Introduo Viso Computacional usando OpenCVMaurcio MarengoniDenise Stringhini Universidade Presbiteriana MackenzieFaculdade de Computao e Informtica e Ps Graduao em Engenharia Eltrica {mmarengoni, dstring}@mackenzie.brResumoEste tutorial apresenta conceitos introdutrios de processamento de imagens e de viso computacional.Estes conceitos so introduzidos utilizando a biblioteca OpenCV, que distribuda gratuitamente e possui documentao farta na internet. 1Introduo Processamento de imagens um processo onde a entrada do sistema uma imagem e a sada um conjunto de valores numricos, que podem ou no compor uma outra imagem. Viso computacional procura emular a viso humana, portanto tambm possui como entrada uma imagem, porm, a sada uma interpretao da imagem como um todo, ou parcialmente.2IntroduoAps uma equalizao de histograma, em nvel de cinza, onde a placa do veculo pode ser lida. Placa:BRK 8558Veculo:Pajero 1995Veculo emimagemescura. Informao daplaca e do veculo no retngulo.3SIBGRAPI 2008 Tutorial 1Introduo Processos de viso computacional geralmente iniciam com o processamento de imagens. Processamento ocorre em trs nveis: baixo-nvel: operaes primitivas (reduo de rudo ou melhoria no contraste de uma imagem) nvel-mdio: operaes do tipo segmentao ou classificao alto-nvel: tarefas de cognio normalmente associadas com a viso humana4OpenCV OpenCV (Open Source Computer Vision) uma biblioteca, de cdigo aberto, desenvolvida inicialmente pela Intel. Implementa ferramentas de interpretao de imagens, indo desde operaes simples como um filtro de rudo, at operaes complexas, tais como a anlise de movimentos, reconhecimento de padres e reconstruo em 3D.5OpenCV Est dividida em cinco grupos de funes: Processamento de imagens; Anlise estrutural; Anlise de movimento e rastreamento de objetos; Reconhecimento de padres; Calibragem de cmera e reconstruo 3D.As principais sero apresentadas juntamente com os conceitos de processamento de imagens e viso computacional que devem ser empregados em seu uso.6OpenCV - Exemplo// conversaoCores.cpp - faz a conversao de //cores de RGB para HSV#include "cv.h"#include "highgui.h"#include int main(){char name[] = "imagens/exemplo1.jpg";// definicao de variaveis do tipo imagemIplImage* img = NULL;IplImage* res = NULL;// definicao de variavel que armazena uma// estrutura com o tamanho de uma imagemCvSize imgSize;// carrega a imagem exemplo1 na variavel imgimg = cvLoadImage( name, -1 );// extrai o tamanho da variavel carregadaimgSize.width = img->width;imgSize.height = img->height;// cria uma nova imagem com o mesmo tamanho// da imagem carregada e do mesmo tipores = cvCreateImage(imgSize, img->depth,img->nChannels );// faz a conversao do sistema de cor RGB para HSVcvCvtColor( img, res, CV_RGB2HSV );// cria uma janela de visualizacao com o nome "imagemoriginal"cvNamedWindow( "imagem original", 1 );// carrega a imagem original na janela criadacvShowImage( "imagem original", img );//repete o processo para a outra imagemcvNamedWindow( "imagem em HSV", 1 );cvShowImage( "imagem em HSV", res );// aguarda alguem pressionar uma tecla do tecladocvWaitKey(0);//fecha as janelas criadascvDestroyWindow( "imagem original" ); cvDestroyWindow( "imagem em HSV" ); // libera memoria usada pelas imagenscvReleaseImage( &img );cvReleaseImage( &res );return(0);}7SIBGRAPI 2008 Tutorial 2OpenCV - Exemplo8Processamento de Imagens Muitas vezes as imagens de onde queremos extrair alguma informao precisam ser convertidas para um determinado formato ou tamanho. Precisam ainda ser filtradas para remover rudos provenientes do processo de aquisio da imagem.9Rudos Rudos podem aparecer de diversas fontes. Exemplos: tipo de sensor utilizado, iluminao do ambiente, condies climticas no momento da aquisio da imagem, posio relativa entre o objeto de interesse e a cmera. Rudo no apenas interferncia no sinal de captura da imagem. So tambm interferncias que possam, atrapalhar a interpretao ou o reconhecimento de objetos na imagem.10RudosImagemnormalInterferncia de iluminaoInterferncia do perodo do anoMudana do tipo de sensor11SIBGRAPI 2008 Tutorial 3Filtros Filtros so as ferramentas bsicas pararemover rudos de imagens. Neste caso, o rudo aquele que aparece no processo de aquisio da imagem. Podem ser: Espaciais: filtros que atuam diretamente na imagem. De frequncia: a imagem transformada para o domnio de frequncia (transformada de Fourier) e ento filtrada neste domnio. Em seguida a imagem filtrada transformada de volta para o domnio de espao.12FiltrosDo lado esquerdo uma imagem com rudo, e nadireita a mesma imagem aps filtragem.13Domnio de espao O termo domnio espacial se refere imagem. Mtodos no domnio espacial esto baseados na manipulao direta dos pixels da prpria imagem. Os processos no domnio espacial so caracterizados pela seguinte expresso: onde: f(x,y) a imagem original, T( . ) uma transformao na imagem e g(x,y) a imagem transformada. )) , ( ( ) , ( y x f T y x g =14Domnio de espao T uma operao definida sobre uma vizinhana de influncia do pixel que estlocalizado na posio x, y. A idia de vizinhana de influncia considera os pixels ao redor da posio x, y. Esta vizinhana definida por uma regio quadrada (ou retangular) e de tamanho (lado) impar. 15SIBGRAPI 2008 Tutorial 4Domnio de espaoRegies de vizinhana (mscaras) de tamanhos diferentes, porm, todos com lado impar.1 x 13 x 35 x 53 x 516Funo de transformao de intensidade O operador T computado em umavizinhana de tamanho 1x1. utilizada para alterar a intensidade da imagem. Pode ser aplicada a toda a imagem ou a umaparte dela. Uma operao bastante til a binarizaode uma imagem, que utiliza um certo valor de corte (k). 17Funo de transformao de intensidade Este tipo de transformao definida pela seguinte expresso:contrario caso ,k y) f(x, se ,01y) g(x,>=Imagem binarizada, com o urso em destaque (maior bloco de pixels com valor 0) . A binarizacao foi obtida com o valor de k=84.cvThreshold(ImgOrigem, ImgBinaria, 84, 255, CV_THRESH_BINARY);18Funo de realce de contrasteOnde, m o valor mdio da regio que se deseja realar o contraste, e E define a inclinao da curva, e conseqentemente os valores de mapeamento para a imagem de sada. Ey x f my x g)) , ( ( 11) , (+=f(x,y)g(x,y)m 01escuroclaro19SIBGRAPI 2008 Tutorial 5Histogramas Os histogramas so determinados a partir de valores de intensidade dos pixels. Entre as principais aplicaes dos histogramas esto melhora da definio de uma imagem compresso de imagens segmentao de imagens descrio de uma imagem 20 O histograma de uma imagem I, cujos valores de intensidade estejam entre 0 e G, definido pela expresso:Histogramask kn I h = ) (Onde:Ik um valor de intensidade k, (0 k G) da imagem I nk o nmero de pixels na imagem I que possuem a intensidade k. cvCalcHist( &ImgOrigem, Histograma, 0, NULL );21 possvel normalizar um histograma, representando os valores em termos de porcentagem:HistogramasnnnI hI pk kk= =) () (Onde n o nmero de pixels da imagem. cvGetMinMaxHistValue( imgHist, 0, &max_value, 0, 0 );cvScale( Hist->bins, Hist->bins, ((double)cvImgHist->height)/max_value, 0 );22 esquerda uma imagem I, ao centro o histograma da imagem em valores (h(I)) e em porcentagem (p(I)), direita uma representao do histograma de forma grfica.Histogramas0 0 0 1 10 0 1 1 20 1 1 2 31 1 2 3 31 2 3 3 3h(I) =p(I) =012 36 9 4 66/25 6/25 4/25 9/25012 3 kh23SIBGRAPI 2008 Tutorial 6 o ajuste dos valores de intensidade de forma a melhorar o contraste em uma imagem.Equalizao de histogramas_==kjjnMNLk eq h0) 1 () ( _Onde k a intensidade no histograma equalizado, L o valor mximo de intensidade na imagem, M e N so as dimenses da imagem enj o nmero de pixels na imagem com valor de intensidade igual a j. cvEqualizeHist( ImagemOriginal, ImagemEqualizada );24Equalizao de histogramasImagem em nvel de cinzaMesma imagem aps equalizaoHistograma da imagemHistograma equalizado da imagem25Filtros no Domnio Espacial Correlao:. ..... .. ..... .. . 5 7 3. .. . 6 4 7. .. . 2 5 6. . . ..... .. ..... .1 2 12 4 21 2 1Posio (x, y) = (4, 4)Mscara 3 x 3(1x5) (2x7) (1x3)(2x6) (4x4) (2x7)(1x2) (2x5) (1x6)Produto ponto a pontoSomatria5+14+3+12+16+14+2+10+6 =82 . ..... .. . 5 7 3. .. . 6827. .. . 2 5 6. . . ..... .Resultado da Correlao_ _ = =+ + =2222) , ( * ) , ( ) , (mm inn jj i w j y i x f y x g26 Convoluo: semelhante correlao, porm neste caso a mscara rotacionada de 180 graus.Filtros no Domnio Espacial_ _ = = =2222) , ( * ) , ( ) , (mm inn jj i w j y i x f y x gOnde w a mscara utilizada no processo de correlao/convoluo, e m e n so as dimenses da mscara. O tipo de filtro depende dos valores da mscara - em geral, as mscaras sosimtricas e, portanto, pode-se aplicar tanto a convoluo como a correlao.cvFilter2D( ImgOriginal, ImgFiltrada, filtro, cvPoint(-1,-1) );27SIBGRAPI 2008 Tutorial 7 Tipos: mdia, mediana, moda, mnimo e mximo. O filtro de mdia, tambm chamado de filtro-caixa, um filtro do tipo passa-baixa. O efeito de um filtro passa-baixa de suavizaoda imagem e minimizao dos rudos, atenuandoas transies abruptas que correspondem a frequncias altas porm, o efeito acaba sendo de embassamento ouborramento da imagem que acaba removendo osdetalhes finos da imagemFiltros no Domnio EspacialEstatsticos28 A expresso de um filtro de mdia dada por:Filtragem no Domnio EspacialFiltros estatsticos< width;tamanhoImagem.height=cvImagem->height;cvImgFiltrada=cvCreateImage(tamanhoImagem, IPL_DEPTH_8U, 1); cvImgCinza=cvCreateImage(tamanhoImagem, IPL_DEPTH_8U, 1); cvCvtColor(cvImagem, cvImgCinza, CV_BGR2GRAY);//Create convolution filterfiltro = cvCreateMatHeader( lado, lado, CV_64FC1 );cvSetData( filtro, kernel, lado*8 );//Call OpenCV convolution:cvFilter2D( cvImgCinza, cvImgFiltrada, filtro, cvPoint(-1,-1) );//salva imagem filtradacvSaveImage("imagens/ursoPretoPassaAlta2.jpg",cvImgFiltrada);return( 0 ); }42Domnio de Freqncia possvel fazer uma troca de base em uma imagem e represent-la em termos uma soma ponderada infinita de um conjunto de senides. Mudanas rpidas na imagem so representadas por freqncias altas. Mudanas suaves so representadas por frequncias baixas. Esta mudana de base pode ser feita utilizando a transformada de Fourier.43SIBGRAPI 2008 Tutorial 11 Expresses que computam a transformadade Fourier:Domnio de Freqncia) ) + =) ( 2) , ( ) , (vy ux je y x f v u Ft_ _==+ =1010) ( 2) , ( ) , (MxNyN y v M x u je y x f v u FtModo contnuoModo discretoA expresso discreta a utilizada na DFT (Discrete Fourier Transform) quegeralmente usada na implementao em computador da transformada de Fourier.44 Pode ser mostrado que o processo de convoluo no domnio espacial correspondea multiplicao de duas expresses no domnio de frequncia, isto :Domnio de Freqncia) , ( * ) , ( ) , ( ) , ( * * ) , ( ) , ( s r W v u F v u G j i w y x f y x g = =Onde ** indica a convoluo entre a imagem f(x,y) com a mscara w(i,j)G(u,v) a transformada de Fourier de g(x,y), que o produto de F(u,v) por W(r,s) F(u,v) a transformada de Fourier de f(x,y)W(r,s) a transformada de Fourier de w(i,j)45Domnio de FreqnciaProcesso de filtragem1. Dada uma imagem f(x,y) de tamanho M x N, obter uma imagem com entorno fp(x,y) de tamanho P x Q onde P = 2M e Q = 2N preenchida com zeros no entorno.2. Multiplique fp(x,y) por (-1)(x+y) para centralizar a transformada.3. Determinara DFT da imagem obtida em b.4. Criar um filtro simtrico H(u,v) de tamanhoP x Q com centro em (P/2,Q/2)465. Fazer o produto H(u,v)*F(u,v) obtido na etapa 3.6. Obter a imagem no domnio de espao fazendo o inverso da transformada de Fourier gp(x,y).7. Multiplicar gp(x,y) por (-1)(x+y) 8. Remover o entorno da imagem obtendo ento g(x,y), que a imagem filtrada.Domnio de FreqnciaProcesso de filtragem (cont.)47SIBGRAPI 2008 Tutorial 12 A expresso que determina o inverso da transformada de Fourier discreta dada por:Domnio de Freqncia_ _==+=1010) ( 2) , (1) , (MuNvN y v M x u je v u FMNy x ftPortanto, definir um filtro no domnio de frequncia corresponde a encontrar uma mscara para ser utilizada em conjunto com a imagem transformada e assim obter a imagem filtrada desejada. 48 Um filtro passa-baixa ideal dado pela expresso:Domnio de FreqnciaFiltros Passa-baixa =contrario caso 0,F v) F(u, se , 1) , (0v u H Filtro passa-alta de Butterworth:nv u F Fv u H20)) , ( / ( 11) , (+= Filtro passa-alta Gaussiano:2 22 / ) , (1 ) , (o v u Fe v u H =53Domnio de FreqnciaFiltros Passa-alta54Segmentao de Imagens Segmentao : Partio da imagem em regies quepossuem algum tipo de semelhana. Etapa inicial no processo de identificaode objetos numa imagem. Existem diversas tcnicas para segmentaruma imagem.55SIBGRAPI 2008 Tutorial 14Segmentao de Imagens56Segmentao de Imagens Tcnicas de Segmentao : Deteco de Bordas Por Corte Baseada em Regies Limiarizao Movimento57Reconhecimento de Objetos O reconhecimento de objetos oupadres em uma imagem um dos principais objetivos de um processo de viso computacional. Existem diversas tcnicas para fazerreconhecimento de padres, geralmente agrupadas como: Estruturais Baseados em teoria da deciso58Reconhecimento de Objetos59SIBGRAPI 2008 Tutorial 15Reconhecimento de Objetos60Reconhecimento de Objetos61Reconhecimento de Objetos Reconhecimento de objetos baseadoem teoria da deciso: Classificador de distncia mnima. Correlao Classificadores Estatsticos Redes Neurais Reconhecimento de objetos baseadoem estruturas: Baseado em Forma.62Rastreamento de Objetos Rastreamento de Objetos umaoperao utilizada para, uma vezidentificado um objeto, acompanh-lo em uma seqncia de imagens. Existem diversas aplicaes para o rastreamento: Comportamentos Verificao de visada Segurana63SIBGRAPI 2008 Tutorial 16Rastreamento de Objetos64Exemplo: camshiftdemo.c CamShift(Continuously Adaptive Mean-SHIFT) um algoritmo desenvolvido para o rastreamento de cor, possibilitando tambm o rastreamento de faces. baseado numa tcnica estatstica onde se busca o pico entre distribuies de probabilidade em gradientes de densidade. Esta tcnica chamada de mdia por deslocamento (mean shift) e foi adaptada no CamShift para tratar a mudana dinmica das distribuies de probabilidade das cores numa seqncia de vdeo.65Exemplo: camshiftdemo.c Para cada frame, a imagem (raw) convertida para outra de distribuio de probabilidade de cor atravs de um modelo de histograma da cor da pele (no caso de rastreamento de faces). O centro e o tamanho da face que se quer rastrear so encontrados atravs do CamShift operando na imagem de probabilidade de cores. O tamanho e a localizao corrente da face so informados e usados para definir o tamanho e a localizao da janela de busca da prxima imagem de vdeo. 66Exemplo: camshiftdemo.cInicializao do programaint main( int argc, char** argv ){CvCapture* capture = 0;if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))//inicializa a captura de vdeo a partir de uma cmeracapture = cvCaptureFromCAM(argc == 2 ? argv[1][0] - '0' : 0 );else if( argc == 2 )//inicializa a captura de vdeo a partir de um arquivo de vdeocapture = cvCaptureFromAVI( argv[1] ); if( !capture ){fprintf(stderr,"Could not initialize capturing...\n");return -1;}printf( "Hot keys: \n //);cvNamedWindow( "Histogram", 1 ); //cria a janela para o histogramacvNamedWindow( "CamShiftDemo", 1 ); //cria a janela para o rastreamento//associa a funo on_mouse janela de rastreamentocvSetMouseCallback( "CamShiftDemo", on_mouse, 0 );//cria os 3 sliders para ajuste dos parmetros (janela CamShiftDemo)cvCreateTrackbar( "Vmin", "CamShiftDemo", &vmin, 256, 0 );cvCreateTrackbar( "Vmax", "CamShiftDemo", &vmax, 256, 0 );cvCreateTrackbar( "Smin", "CamShiftDemo", &smin, 256, 0 );67SIBGRAPI 2008 Tutorial 17Exemplo: camshiftdemo.cJanelas criadas68Exemplo: camshiftdemo.cDefinio do objeto (funo on_mouse)69Exemplo: camshiftdemo.cTrechos selecionados cvInRangeS: verifica se os elementos em hsv (previamente convertida a partir da imagem RGB obtida do frame original) esto entre os dois escalares indicados nos parmetros 2 e 3. O parmetro mask a imagem destino que armazenar os pixels que interessaro no clculo do histograma. cvSplit: retira um dos canais e armazena na imagem de hue (matiz), que ser usada no clculo do histograma e da sua projeo de fundo (retro-projeo ou back projection).cvInRangeS( hsv, cvScalar(0,smin,MIN(_vmin,_vmax),0),cvScalar(180,256,MAX(_vmin,_vmax),0), mask );cvSplit( hsv, hue, 0, 0, 0 ); 70Exemplo: camshiftdemo.cTrechos selecionados cvCalcBackProject: calcula a projeo de fundo (retro-projeo) do histograma baseado na imagem de matiz (hue). cvAnd: calcula um E lgico entre a imagem de fundo do histograma e a mscara calculada anteriormente (que possui os pixels de interesse) - o resultado novamente armazenado na imagem de fundo do histograma (backproject). cvCamShift: chama o algoritmo CamShift para buscar o centro, o tamanho e a orientao do objeto sendo rastreado e armazenar em track_comp.cvCalcBackProject( &hue, backproject, hist );cvAnd( backproject, mask, backproject, 0 );cvCamShift( backproject, track_window, cvTermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER,0, 1), &track_comp, &track_box );71SIBGRAPI 2008 Tutorial 18Exemplo: camshiftdemo.cTrechos selecionados track_window recebe a rea retangular onde est inserido o objeto rastreado e uma elipse desenhadaao redor do objeto.track_window = track_comp.rect; if( backproject_mode )cvCvtColor( backproject, image, CV_GRAY2BGR );if( image->origin )track_box.angle = -track_box.angle;cvEllipseBox(image, track_box, CV_RGB(255,0,0), 3,CV_AA, 0);72Exemplo: camshiftdemo.cObjeto detectado73Exemplo: camshiftdemo.cObjeto rastreado74Ajuste do ambiente do OpenCV75SIBGRAPI 2008 Tutorial 19WindowsAjustar a PATH para a biblioteca: Em Meu Computador use o boto direito do mouse e selecione Propriedades. Clique na abaAvanado e aps no boto de Variveis do Ambiente na parte inferior da janela (no Vista ainda ser necessrio seguir o link Advanced System Settings antes deste passo).76WindowsAjustar a PATH para a biblioteca (cont.): Nas Variveis do usurio est a PATH, edite-a para acrescentar o local onde a biblioteca OpenCV foi instalada o caminho padro C:\Arquivos de Programa\OpenCV\bin Acrescente tambm o caminho para a biblioteca de interface o caminho padro C:\ Arquivos de Programa\OpenCV\otherlibs\highgui Lembre-se de separ-las utilizando ;.OBS: possvel que a PATH do OpenCV seja atualizada automaticamente durante a instalao, mas necessrio verificar.77WindowsVisual Studio 2005 Abrir o ambiente do Visual Studio 2005. Abrir o arquivo opencv.sln na pasta _make da instalao (C:\Arquivos de Programa\OpenCV\_make). Isto deve carregar toda a soluo do OpenCV no ambiente do Visual Studio 2005. Selecionar a opo Build no menu e clicar em build-solution para compilar a biblioteca. Esta compilao pode levar algum tempo.78WindowsDevCPP Abrir o Bloodshed Dev-C++ (verso testada: 4.9.9.2). Para ligar (link) os programas desenvolvidos no Dev C++ com as bibliotecas do OpenCV: Clicar em Tools e selecionar Compiler Options. O sistema deve abrir uma janela com a aba Compilerselecionada. Marcar o box Add these commands to the linker command line e copiar os seguintes comandos: -lhighgui -lcv -lcxcore -lcvaux lcvcam79SIBGRAPI 2008 Tutorial 20WindowsDevCPP (cont.) Na aba Directories, em Binaries adicionar o caminho: C:\Arquivos de Programa\OpenCV\bin. Em C Includes adicionar os caminhos:C:\Arquivos de Programa\OpenCV\cxcore\include;C:\Arquivos de Programa\OpenCV\cv\include;C:\Arquivos de Programa\OpenCV\otherlibs\highgui;C:\Arquivos de Programa\OpenCV\cvaux\include; C:\Arquivos de Programa\OpenCV\otherlibs\cvcam\include Em C++ Includes adicionar os mesmos caminhos acima. Em Libraries adicionar o caminho:C:\Arquivos de Programa\OpenCV\lib80WindowsTestar a instalao no Windows Abrir o ambiente de trabalho escolhido e carregar o arquivo: C:\Arquivos de Programa\OpenCV\samples\c\contours.c. Criar um novo arquivo de programa em branco: teste.cpp. Copiar e colar todo o arquivo contours.c para o arquivo em branco teste.cpp, salve o arquivo teste.cpp. Compilar e executar o programa teste.cpp. Este programa analisa uma imagem sinttica com faces e extrai regies diferentes da imagem. Pode-se alterar parmetros ou linhas do cdigo e ver os resultados. (No esquecer de recompilar o programa aps as alteraes).81Linux e g++ Entrar com login de super-usurio. Ir ao diretrio onde foi feito o download do arquivo tar.gz do OpenCV. Na janela aberta, digitar os seguintes comandos:tar -xzf opencv-0.9.7.tar.gzcd opencv-0.9.7./configure && make && make install 82Linux e g++ Fazer os ajustes para o G++: Ir ao diretrio home e abrir o arquivo .bashrc(para o ambiente bash). Acrescentar a seguinte linha ao arquivo:alias gcv="g++ -I/usr/local/include/opencv -lcv -lcxcore -lcvaux -lhighgui"83SIBGRAPI 2008 Tutorial 21Linux e g++Testar a instalao no Linux Ir ao diretrio onde est instalado o OpenCV. Procurar o sub-diretrio samples e entrar no sub-diretrio c. Digitar a linha de comando abaixo que deve executar o programa contours.c:gcv contours.c && ./a.out84SIBGRAPI 2008 Tutorial 22