Arquivos

Posts Tagged ‘Visao Computacional’

Principios para identificação de caracteres em Python

fevereiro 8, 2010 3 comentários

Olá Galera,

No meu último post descobri como é agradável brincar com manipulação de imagens em Python (PIL),  então começei a imaginar como aplicar isso em algo para melhor ser aproveitado, no mesmo momento me veio a cabeça  ”pq não identificar caracteres ??”

Mas nada na vida é tão simples como pensamos ser, a principio me perguntei “como pegar letras de uma palavra separadamente?” muitas perguntas  hahaha então descobri que antes de iniciar qualquer método teria antes que separar as letras de uma palavra para só assim avançar …

A idéia Seria uma palavra sem firulas em uma font black e em um fundo branco, assim poderia abrir esta imagem procurar pela ocorrencia da cor mais escura e quando a encontrasse eu estaria em uma letra da palavra assim eu poderia pegar a localização para depois iniciar a parte mais avançada do script segue o source que faz a brincadeira …

Imagem Original para os meus testes:

Então Aplicando na prática temos:

Compartilhando o source:

#Eder de Souza
#Encontrar Letras

from PIL import Image
import ImageFont, ImageDraw, ImageOps

im2 = Image.open(“eder.jpg”)

letraini = False
achouletra=False
inicio = 0
fim = 0
letras = []
for y in range(im2.size[0]): 
  for x in range(im2.size[1]): 
    pixel = im2.getpixel((y,x))
    r,g,b = pixel
    color = (r + g + b) / 3
    if color < 90:
      letraini = True
  if achouletra == False and letraini == True:
    achouletra = True
    inicio = y
  if achouletra == True and letraini == False:
    achouletra = False
    fim = y
    letras.append((inicio,fim))

  letraini=False

draw = ImageDraw.Draw(im2)

for y in (letras):
    inicio,fim = y
    draw.rectangle((inicio, 0, fim, (im2.size[1]-1)), outline=(16, 152, 22))
im2.save(“output.jpg”)
print “verifique arquivo de saida”

Logo Postareis mais testes quando tiver tempo

Att,

Eng Eder de Souza

Computação Gráfica Python em ação

fevereiro 4, 2010 3 comentários

Estava eu deitado sem nada para fazer !!

A parte mais complicada foi alinhar os pixels na tela.

Funciona da seguinte maneira abrimos uma imagem capturando cada pixel dela para depois converter em ascii, o RGB de retorno é substituido por um caractere após a média…

Resultado da brincadeira !!

Imagem Original

Convertendo para Ascii

##############################################################

Imagem Original

Convertendo para ascii

Source para quem gosta de brincar:

###Eng Eder de souza
##03/02/2010
from PIL import Image
import sys

arquivo=sys.argv[1]

img = Image.open(arquivo)

if img.size[0] > 80:
   img.thumbnail((89,89))

cont = 1

for row in range(img.size[1]):

    for col in range(img.size[0]):
        pixel = img.getpixel((col,row))
        if type(pixel) == int:
           r = pixel
           g = pixel
           b = pixel
        else:
           r,g,b = pixel
        color = (r + g + b) / 3

        if cont < img.size[0]:

     if color < 19:
               print(‘&’),
          elif color < 50:
               print(’8′),
          elif color < 75:
               print(’0′),
          elif color < 100:
               print(‘$’),
          elif color < 130:
               print(’2′),
          elif color < 165:
               print(’1′),
          elif color < 180:
               print(‘|’),
          elif color < 200:
               print(‘;’),
          elif color < 218:
               print(‘:’),
          elif color < 229:
               print(“‘”),
          elif color <= 255:
               print(‘ ‘),
                cont = cont + 1
        else:
     if color < 19:
                        print(‘&’),
                elif color < 50:
                        print(’8′),
                elif color < 75:
                        print(’0′),
                elif color < 100:
                        print(‘$’),
                elif color < 130:
                        print(’2′),
                elif color < 165:
                        print(’1′),
                elif color < 180:
                        print(‘|’),
                elif color < 200:
                        print(‘;’),
                elif color < 218:
                        print(‘:’),
                elif color < 229:
                        print(“‘”),
                elif color <= 255:
                        print(‘ ‘),
                print
                cont = 1

Até

Protótipo: Asterisk + Visão Computacional = Monitoramento

/*

#    _
#   |_)\_/
#   |_) |
#
#
#    ___    _              _       ___
#   | __|__| |___ _ _   __| |___  / __| ___ _  _ _____ _
#   | _|/ _` / -_) ‘_| / _` / -_) \__ \/ _ \ || |_ / _` |
#   |___\__,_\___|_|   \__,_\___| |___/\___/\_,_/__\__,_|
Conecta Uma Web Cam e fica a espera de qualquer movimento detectado e faz
conexão com o Asterisk para iniciar Ligação …
Instruções de Compilação:
    DevC++: Tools > Compiler Options > Add linker -lhighgui -lcv -lcxcore
-lcvaux -lcvcam -lws2_32.
   
    Inserir todos os Includes do OpenCV e integrar ao compilador
   
————————————————————————————————————
Dependências:
    windows -> winsock2.h, WSDATA wsa_data, OpenCV.
    unix/linux -> <sys/types.h>, <sys/socket.h>, <arpa/inet.h>, OpenCV.
    comuns -> <iostream>, <unistd.h>, <string.h>, OpenCv
   
   
    Eng. Eder de Souza
    email: ederwan…@gmail.com, ederwan…@yahoo.com.br
   
     Data: 17-07-2009
    Visão Computacional + Asterisk para monitoramento via Web Cam
    Monitoramento de áreas sem presença de movimentos, se alguma percepção de
movimento for encontrado Servidor Asterisk Liga para comunicação …
   
*/
#include <stdlib.h>
 
// OpenCV includes.
#include <cv.h>
#include <highgui.h>
//
#include <iostream>
#include <process.h>
#include <time.h>
#include <unistd.h>
#include <string.h>
#ifdef unix
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#else
#include <winsock2.h>
#include <windows.h>
#include <winsock2.h>
#include <stdio.h>
WSADATA wsa_data;
#endif
 
#define DEFAULT_BUFLEN 512
//IP e Porta para se Conectar ao Socket Perl Asterisk
#define DEFAULT_PORT 8888
#define IP “192.168.0.34″
//Intervalo para Iniciar a Ligação entre um movimento detectado
//Valor em mili-Segundos
#define intervalo 50000
using namespace std;
long int cont = 0;
int Me_Liga() {
    //———————-
    // Declarando e inicializando Variaveis.
    int iResult;
    WSADATA wsaData;
    SOCKET ConnectSocket;
    struct sockaddr_in clientService;
    int recvbuflen = DEFAULT_BUFLEN;
    char *sendbuf = “Movimento Detectado\n”;
    char recvbuf[DEFAULT_BUFLEN] = “”;
    //———————-
    // Inicializando o  Winsock
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != NO_ERROR) {
        printf(“WSAStartup Falhou com erro: %d\n”, iResult);
        return 1;
    }
    //———————-
    // Criando o Socket para se conectar ao Servidor
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET) {
        printf(“socket Falhou com erro: %ld\n”, WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //———————-
    // IP e porta do Servidor Perl Asterisk para se conectar.
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr( IP );
    clientService.sin_port = htons( DEFAULT_PORT );
    //———————-
    // Conecta ao server em perl com o Asterisk.
    iResult = connect( ConnectSocket, (SOCKADDR*) &clientService,
sizeof(clientService) );
    if (iResult == SOCKET_ERROR) {
        printf( “Conexao Falhou com erro: %d\n”, WSAGetLastError() );
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
  }
    //———————-
    // Enviando mensagem para Servidor
    iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
    if (iResult == SOCKET_ERROR) {
        printf(“send() Falhou com erro: %d\n”, WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
    }
    printf(“Bytes envido: %d\n”, iResult);
    // Mata a Conexao com o Socket
    iResult = shutdown(ConnectSocket, SD_SEND);
    if (iResult == SOCKET_ERROR) {
        printf(“shutdown falhou com  erro: %d\n”, WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
    }
    // Resposta do socket
    do {
        iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
        if ( iResult > 0 )
            printf(“Bytes recebido: %d\n”, iResult);
        else if ( iResult == 0 )
            printf(“Conexao Encerrada\n”);
        else
            printf(“recebimento falhou com erro: %d\n”, WSAGetLastError());
    } while( iResult > 0 );

    // limpando
    closesocket(ConnectSocket);
    WSACleanup();
 
}

static void Thread1 (LPVOID lpParam){
   
   
  
            cont=cont+1;
            Sleep(intervalo);
   
    printf(“%d Contador \n”, cont);
  
  if(cont >= 1){
    cont=0;
    Me_Liga();
   
}
}

int main()
{
 //Cria uma janela
 cvNamedWindow(“Eng_Eder_souza”, CV_WINDOW_AUTOSIZE);
 
 //Cria objeto para captura.
 CvCapture* inputMovie;
 
 //Informa o modo de captura.
     inputMovie = cvCaptureFromCAM(0);

 
 //tamanho da imagem
 CvSize imgSize;
 imgSize.width = 320;
 imgSize.height = 240;
 
 //Imagens para usar no programa
 IplImage* greyImage = cvCreateImage( imgSize, IPL_DEPTH_8U, 1);
 IplImage* colourImage;
 IplImage* movingAverage = cvCreateImage( imgSize, IPL_DEPTH_32F, 3);
 IplImage* difference;
 IplImage* temp;
 IplImage* motionHistory = cvCreateImage( imgSize, IPL_DEPTH_8U, 3);
 
 //Retangulo nos objetos
 CvRect bndRect = cvRect(0,0,0,0);
 
 //Pontos para o retangulo
 CvPoint pt1, pt2;
 
 //Cria uma font para o objeto.
 CvFont font;
 
 
 
 int inicio = 0;
 
 //Buffer
 
 char Scores[60000];
 
          
 //centraliza X do retangulo
 int avgX = 0;
 
 //Indica a primeira vez do loop de um frame
 bool first = true;
 
 
 //Mantem proceços do Frame de pé
 for(;;)
 {
  //Pega o Frame da entrada de Video
  colourImage = cvQueryFrame(inputMovie);
 
  //Se nao existir mais framas cair fora do For
  if( !colourImage )
  {
   break;
  }
  
  //Primeira vez para iniciar Imagem
  if(first)
  {
   difference = cvCloneImage(colourImage);
   temp = cvCloneImage(colourImage);
   cvConvertScale(colourImage, movingAverage, 1.0, 0.0);
   
   first = false;
  }
  //else, faz a detecção de movimento
  else
  {
   cvRunningAvg(colourImage, movingAverage, 0.020, NULL);
  }
 
  //Converte a scala do video
  cvConvertScale(movingAverage, temp, 1.0, 0.0);
 
  //analiza o frame corrente
  cvAbsDiff(colourImage,temp,difference);
  
  //converte a imagem para grayscale.
  cvCvtColor(difference, greyImage, CV_RGB2GRAY);
  
  //Converte a imagem para black and white.
  cvThreshold(greyImage, greyImage, 70, 255, CV_THRESH_BINARY);
  
  cvDilate(greyImage, greyImage, 0, 18);
  cvErode(greyImage, greyImage, 0, 10);
 
  //acha o contador de imagens em video
  CvMemStorage* storage = cvCreateMemStorage(0);
        CvSeq* contour = 0;
  cvFindContours( greyImage, storage, &contour, sizeof(CvContour),
CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
 
  //processa cada movimento no frame corrente
        for( ; contour != 0; contour = contour->h_next )
        {
   //pega quadrado nos objetos em movimento
   bndRect = cvBoundingRect(contour, 0);
 
   pt1.x = bndRect.x;
   pt1.y = bndRect.y;
   pt2.x = bndRect.x + bndRect.width;
   pt2.y = bndRect.y + bndRect.height;
         sprintf(Scores, “Com Movimento”);
   
   
   if(inicio == 0){
            Me_Liga();
            inicio = 1;
            }
            else{
                
               
                 if(cont == 0){
                  //Inicia a Thread para o Intervalo de tempo para Ligar
                 _beginthread( Thread1, 0, NULL );}
                 }
   
            }
         
   
 
  //desenha um retangulo nos objetos em movimento.
  cvRectangle(colourImage, pt1, pt2, CV_RGB(255,0,0), 1);
 
        cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.8, 0.8, 0, 2);
  cvPutText(colourImage, Scores, cvPoint(60, 200), &font, cvScalar(0, 0, 300));
  
  //Mostra o Frame.
  cvShowImage(“Eng_Eder_souza”, colourImage);
  
  
  cvWaitKey(10);
  sprintf(Scores, “Sem Movimento”);
        printf(“Apenas um Frame\n”);
  //Escreve o Frame no video de saida
 
 }
 
 // Termina com a imagem o video e a janela
 cvReleaseImage(&temp);
 cvReleaseImage(&difference);
 cvReleaseImage(&greyImage);
 cvReleaseImage(&movingAverage);
 cvDestroyWindow(“Eng_Eder_souza”);
 
 cvReleaseCapture(&inputMovie);
 
 return(0);
}
 
 
///#####FIM#####
 
Agora Segue script em Perl que recebe o socket e dispara a Ligação via Asterisk
este deve estar no servidor Asterisk executando no servidor Asterisk.
 
exemplo “perl serverasteriskEder.pl 8888″
 
#Eng. Eder de Souza
#    email: ederwan…@gmail.com, ederwan…@yahoo.com.br
#    Data: 22-09-2008
use IO::Socket::INET;
use strict;

my $numero;
my $arquivo;
my $r;
my $port = shift
    or die”Falta o numero da porta\n”;
my $socket = IO::Socket::INET->new(‘LocalPort’ => $port,
                                   ‘Proto’ => ‘tcp’,
                                   ‘Listen’ => SOMAXCONN)
    or die “Can’t create socket ($!)\n”;
print “Server listening\n”;
while (my $client = $socket->accept) {
    my $name = gethostbyaddr($client->peeraddr, AF_INET);
    my $port = $client->peerport;
    while (<$client>) {
        print “[$name $port] $_”;
        print $client “$.: $_”;
$r = $_;
if( $r =~ /Movimento/) {
print $r,”\n”;
        system(“echo ‘$r’ > /tmp/test.txt”);
        open ($arquivo, ‘</var/lib/asterisk/agi-bin/telefones.txt’);
        while (<$arquivo>) {
           $numero = $_;
           my $discar = “/var/spool/asterisk/”.$numero.”.call”;
           my $arqdestino = “/var/spool/asterisk/outgoing/” ;
           open(EXTEN,”>$discar”);
           print EXTEN “Channel: Sip/$numero\n”;
           print EXTEN “MaxRetries: 5\n”;
           print EXTEN “RetryTime: 60 \n”;
           print EXTEN “WaitTime: 60 \n”;
           print EXTEN “Context: Saida\n”;
           print EXTEN “Extension: 3300\n”;
           print EXTEN “Priority: 1\n”;
           close(EXTEN);
           system(“mv /var/spool/asterisk/*.call $arqdestino”);
       }
       close $arquivo;

        }
 

}
    close $client
        or die “cliente encerrou conexao ($!)\n”;
}
die “socket com problema ($!)\n”;

 
###FIM###
 
 
[]‘s
 
Eng Eder de Souza

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.