Arquivos
Principios para identificação de caracteres em Python
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
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






