<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;"><DIV>Olá Lista!!</DIV>
<DIV> </DIV>
<DIV>Estou meio Sumido o tempo esta escasso.</DIV>
<DIV> </DIV>
<DIV>Fiz um sistema de monitoramente via Web Cam útil para locais onde ninguém pode entrar. Na realidade eu monitoro via qualquer web cam a ocorrencia de movimento se for encontrado eu disparo uma chamada via socket para o Asterisk.</DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV>/*</DIV>
<DIV><BR># _<BR># |_)\_/<BR># |_) |<BR>#<BR>#<BR># ___ _ _ ___<BR># | __|__| |___ _ _ __| |___ / __| ___ _ _ _____ _<BR># | _|/ _` / -_) '_| / _` / -_) \__ \/ _ \ || |_ / _` |<BR># |___\__,_\___|_| \__,_\___| |___/\___/\_,_/__\__,_|</DIV>
<DIV>Conecta Uma Web Cam e fica a espera de qualquer movimento detectado e faz conexão com o Asterisk para iniciar Ligação ...</DIV>
<DIV>Intruções de Compilação:<BR> DevC++: Tools > Compiler Options > Add linker -lhighgui -lcv -lcxcore -lcvaux -lcvcam -lws2_32.<BR> <BR> Inserir todos os Includes do OpenCV e integrar ao compilador<BR> <BR>------------------------------------------------------------------------------------------------------------<BR>Dependências:<BR> windows -> winsock2.h, WSDATA wsa_data, OpenCV.<BR> unix/linux -> <sys/types.h>, <sys/socket.h>, <arpa/inet.h>, OpenCV.<BR> comuns -> <iostream>, <unistd.h>, <string.h>, OpenCv<BR> <BR> <BR> Eng. Eder de Souza <BR> email: <A href="mailto:ederwander@gmail.com">ederwander@gmail.com</A>, <A href="mailto:ederwander@yahoo.com.br">ederwander@yahoo.com.br</A><BR>
</DIV>
<DIV> Data: 17-07-2009<BR> Visão Computacional + Asterisk para monitoramento via Web Cam<BR> Monitoramento de áreas sem presença de movimentos, se alguma percepção de movimento for encontrado Servidor Asterisk Liga para comunicação ...<BR> <BR>*/</DIV>
<DIV>#include <stdlib.h><BR> <BR>// OpenCV includes.<BR>#include <cv.h><BR>#include <highgui.h><BR>//</DIV>
<DIV>#include <iostream><BR>#include <process.h><BR>#include <time.h><BR>#include <unistd.h><BR>#include <string.h><BR>#ifdef unix<BR>#include <sys/types.h><BR>#include <sys/socket.h><BR>#include <arpa/inet.h><BR>#else<BR>#include <winsock2.h><BR>#include <windows.h><BR>#include <winsock2.h><BR>#include <stdio.h><BR>WSADATA wsa_data;<BR>#endif</DIV>
<DIV> </DIV>
<DIV>#define DEFAULT_BUFLEN 512</DIV>
<DIV>//IP e Porta para se Conectar ao Socket Perl Asterisk<BR>#define DEFAULT_PORT 8888<BR>#define IP "192.168.0.34"</DIV>
<DIV>//Intervalo para Iniciar a Ligação entre um movimento detectado<BR>//Valor em mili-Segundos<BR>#define intervalo 50000</DIV>
<DIV>using namespace std;<BR>long int cont = 0;</DIV>
<DIV>int Me_Liga() {</DIV>
<DIV> //----------------------<BR> // Declarando e inicializando Variaveis.<BR> int iResult;<BR> WSADATA wsaData;</DIV>
<DIV> SOCKET ConnectSocket;<BR> struct sockaddr_in clientService; </DIV>
<DIV> int recvbuflen = DEFAULT_BUFLEN;<BR> char *sendbuf = "Movimento Detectado\n";<BR> char recvbuf[DEFAULT_BUFLEN] = "";</DIV>
<DIV> //----------------------<BR> // Inicializando o Winsock<BR> iResult = WSAStartup(MAKEWORD(2,2), &wsaData);<BR> if (iResult != NO_ERROR) {<BR> printf("WSAStartup Falhou com erro: %d\n", iResult);<BR> return 1;<BR> }</DIV>
<DIV> //----------------------<BR> // Criando o Socket para se conectar ao Servidor <BR> ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);<BR> if (ConnectSocket == INVALID_SOCKET) {<BR> printf("socket Falhou com erro: %ld\n", WSAGetLastError());<BR> WSACleanup();<BR> return 1;<BR> }</DIV>
<DIV> //----------------------<BR> // IP e porta do Servidor Perl Asterisk para se conectar.<BR> clientService.sin_family = AF_INET;<BR> clientService.sin_addr.s_addr = inet_addr( IP );<BR> clientService.sin_port = htons( DEFAULT_PORT );</DIV>
<DIV> //----------------------<BR> // Conecta ao server em perl com o Asterisk.<BR> iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );<BR> if (iResult == SOCKET_ERROR) {<BR> printf( "Conexao Falhou com erro: %d\n", WSAGetLastError() );<BR> closesocket(ConnectSocket);<BR> WSACleanup();<BR> return 1;<BR> }</DIV>
<DIV> //----------------------<BR> // Enviando mensagem para Servidor<BR> iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );<BR> if (iResult == SOCKET_ERROR) {<BR> printf("send() Falhou com erro: %d\n", WSAGetLastError());<BR> closesocket(ConnectSocket);<BR> WSACleanup();<BR> return 1;<BR> }</DIV>
<DIV> printf("Bytes envido: %d\n", iResult);</DIV>
<DIV> // Mata a Conexao com o Socket<BR> iResult = shutdown(ConnectSocket, SD_SEND);<BR> if (iResult == SOCKET_ERROR) {<BR> printf("shutdown falhou com erro: %d\n", WSAGetLastError());<BR> closesocket(ConnectSocket);<BR> WSACleanup();<BR> return 1;<BR> }</DIV>
<DIV> // Resposta do socket<BR> do {</DIV>
<DIV> iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);<BR> if ( iResult > 0 )<BR> printf("Bytes recebido: %d\n", iResult);<BR> else if ( iResult == 0 )<BR> printf("Conexao Encerrada\n");<BR> else<BR> printf("recebimento falhou com erro: %d\n", WSAGetLastError());</DIV>
<DIV> } while( iResult > 0 );</DIV>
<DIV><BR> // limpando<BR> closesocket(ConnectSocket);<BR> WSACleanup();</DIV>
<DIV> <BR>}</DIV>
<DIV><BR>static void Thread1 (LPVOID lpParam){<BR> <BR> </DIV>
<DIV> <BR> cont=cont+1;<BR> Sleep(intervalo);<BR> </DIV>
<DIV> printf("%d Contador \n", cont);<BR> <BR> if(cont >= 1){<BR> cont=0;<BR> Me_Liga();<BR> <BR>}<BR>}</DIV>
<DIV><BR>int main()<BR>{<BR> //Cria uma janela<BR> cvNamedWindow("Eng_Eder_souza", CV_WINDOW_AUTOSIZE);<BR> <BR> //Cria objeto para captura.<BR> CvCapture* inputMovie;<BR> <BR> //Informa o modo de captura.<BR> inputMovie = cvCaptureFromCAM(0);</DIV>
<DIV><BR> <BR> //tamanho da imagem<BR> CvSize imgSize;<BR> imgSize.width = 320;<BR> imgSize.height = 240;<BR> <BR> //Imagens para usar no programa<BR> IplImage* greyImage = cvCreateImage( imgSize, IPL_DEPTH_8U, 1);<BR> IplImage* colourImage;<BR> IplImage* movingAverage = cvCreateImage( imgSize, IPL_DEPTH_32F, 3);<BR> IplImage* difference;<BR> IplImage* temp;<BR> IplImage* motionHistory = cvCreateImage( imgSize, IPL_DEPTH_8U, 3);<BR> <BR> //Retangulo nos objetos <BR> CvRect bndRect = cvRect(0,0,0,0);<BR> <BR> //Pontos para o retangulo<BR> CvPoint pt1, pt2;<BR> <BR> //Cria uma font para o objeto.<BR> CvFont font;<BR> <BR> <BR> </DIV>
<DIV> int inicio = 0;<BR> </DIV>
<DIV> //Buffer <BR> <BR> char Scores[60000];<BR> <BR> <BR> //centraliza X do retangulo<BR> int avgX = 0;<BR> <BR> //Indica a primeira vez do loop de um frame<BR> bool first = true;<BR> </DIV>
<DIV> <BR> //Mantem proceços do Frame de pé<BR> for(;;)<BR> {<BR> //Pega o Frame da entrada de Video<BR> colourImage = cvQueryFrame(inputMovie);<BR> <BR> //Se nao existir mais framas cair fora do For<BR> if( !colourImage )<BR> {<BR> break;<BR> }<BR> <BR> //Primeira vez para iniciar Imagem<BR> if(first)<BR> {<BR> difference = cvCloneImage(colourImage);<BR> temp = cvCloneImage(colourImage);<BR> cvConvertScale(colourImage, movingAverage, 1.0, 0.0);<BR> <BR> first = false;<BR> }<BR> //else, faz a detecção de movimento <BR> else<BR> {<BR> cvRunningAvg(colourImage, movingAverage, 0.020, NULL);<BR> }<BR> <BR> //Converte a scala do
video<BR> cvConvertScale(movingAverage, temp, 1.0, 0.0);<BR> <BR> //analiza o frame corrente<BR> cvAbsDiff(colourImage,temp,difference);<BR> <BR> //converte a imagem para grayscale.<BR> cvCvtColor(difference, greyImage, CV_RGB2GRAY);<BR> <BR> //Converte a imagem para black and white.<BR> cvThreshold(greyImage, greyImage, 70, 255, CV_THRESH_BINARY);<BR> <BR> cvDilate(greyImage, greyImage, 0, 18);<BR> cvErode(greyImage, greyImage, 0, 10);<BR> <BR> //acha o contador de imagens em video<BR> CvMemStorage* storage = cvCreateMemStorage(0);<BR> CvSeq* contour = 0;<BR> cvFindContours( greyImage, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );<BR> <BR> //processa cada movimento no frame
corrente<BR> for( ; contour != 0; contour = contour->h_next )<BR> {<BR> //pega quadrado nos objetos em movimento<BR> bndRect = cvBoundingRect(contour, 0);<BR> <BR> pt1.x = bndRect.x;<BR> pt1.y = bndRect.y;<BR> pt2.x = bndRect.x + bndRect.width;<BR> pt2.y = bndRect.y + bndRect.height;<BR> sprintf(Scores, "Com Movimento");<BR> <BR> <BR> if(inicio == 0){<BR> Me_Liga();<BR> inicio = 1;<BR> }<BR>
else{<BR> <BR> <BR> if(cont == 0){<BR> //Inicia a Thread para o Intervalo de tempo para Ligar <BR> _beginthread( Thread1, 0, NULL );} <BR> }<BR> <BR> }<BR> <BR> <BR> <BR> //desenha um retangulo nos objetos em
movimento.<BR> cvRectangle(colourImage, pt1, pt2, CV_RGB(255,0,0), 1);<BR> <BR> cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.8, 0.8, 0, 2);<BR> cvPutText(colourImage, Scores, cvPoint(60, 200), &font, cvScalar(0, 0, 300));<BR> <BR> //Mostra o Frame.<BR> cvShowImage("Eng_Eder_souza", colourImage);<BR> <BR> <BR> cvWaitKey(10);<BR> sprintf(Scores, "Sem Movimento");<BR> printf("Apenas um Frame\n"); <BR> //Escreve o Frame no video de saida<BR> <BR> }<BR> <BR> // Termina com a imagem o video e a
janela<BR> cvReleaseImage(&temp);<BR> cvReleaseImage(&difference);<BR> cvReleaseImage(&greyImage);<BR> cvReleaseImage(&movingAverage);<BR> cvDestroyWindow("Eng_Eder_souza");<BR> <BR> cvReleaseCapture(&inputMovie);</DIV>
<DIV> <BR> return(0);<BR>}</DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV>///#####FIM#####</DIV>
<DIV> </DIV>
<DIV>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.</DIV>
<DIV> </DIV>
<DIV>exemplo "perl serverasteriskEder.pl 8888"</DIV>
<DIV> </DIV>
<DIV>#Eng. Eder de Souza<BR># email: <A href="mailto:ederwander@gmail.com">ederwander@gmail.com</A>, <A href="mailto:ederwander@yahoo.com.br">ederwander@yahoo.com.br</A></DIV>
<DIV># Data: 22-09-2008</DIV>
<DIV>use IO::Socket::INET;<BR>use strict;</DIV>
<DIV><BR>my $numero;<BR>my $arquivo;<BR>my $r;</DIV>
<DIV>my $port = shift<BR> or die"Falta o numero da porta\n";</DIV>
<DIV>my $socket = IO::Socket::INET->new('LocalPort' => $port,<BR> 'Proto' => 'tcp',<BR> 'Listen' => SOMAXCONN)<BR> or die "Can't create socket ($!)\n";<BR>print "Server listening\n";<BR>while (my $client = $socket->accept) {<BR> my $name = gethostbyaddr($client->peeraddr, AF_INET);<BR> my $port = $client->peerport;<BR> while (<$client>) {<BR> print "[$name $port] $_";<BR>
print $client "$.: $_";<BR>$r = $_;<BR>if( $r =~ /Movimento/) {</DIV>
<DIV>print $r,"\n";</DIV>
<DIV> system("echo '$r' > /tmp/test.txt");</DIV>
<DIV> open ($arquivo, '</var/lib/asterisk/agi-bin/telefones.txt');<BR> while (<$arquivo>) {<BR> $numero = $_;<BR> my $discar = "/var/spool/asterisk/".$numero.".call";<BR> my $arqdestino = "/var/spool/asterisk/outgoing/" ;<BR> open(EXTEN,">$discar");<BR> print EXTEN "Channel: Sip/$numero\n";<BR> print EXTEN "MaxRetries: 5\n";<BR> print EXTEN "RetryTime: 60 \n";<BR> print EXTEN "WaitTime: 60
\n";<BR> print EXTEN "Context: ital\n";<BR> print EXTEN "Extension: 3300\n";<BR> print EXTEN "Priority: 1\n";<BR> close(EXTEN);<BR> system("mv /var/spool/asterisk/*.call $arqdestino");<BR> }<BR> close $arquivo;</DIV>
<DIV><BR> }</DIV>
<DIV> </DIV>
<DIV><BR>}<BR> close $client<BR> or die "cliente encerrou conexao ($!)\n";<BR>}<BR>die "socket com problema ($!)\n";<BR></DIV>
<DIV> </DIV>
<DIV>###FIM###</DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV>[]'s</DIV>
<DIV> </DIV>
<DIV>Eng Eder de Souza</DIV>
<DIV> </DIV>
<DIV> </DIV></td></tr></table><br>
<hr size=1>Veja quais são os assuntos do momento no Yahoo! + Buscados: <a href="http://br.rd.yahoo.com/mail/taglines/mail/*http://br.maisbuscados.yahoo.com/">Top 10</a> - <a href="http://br.rd.yahoo.com/mail/taglines/mail/*http://br.maisbuscados.yahoo.com/celebridades/">Celebridades</a> - <a href="http://br.rd.yahoo.com/mail/taglines/mail/*http://br.maisbuscados.yahoo.com/m%C3%BAsica/">Música</a> - <a href="http://br.rd.yahoo.com/mail/taglines/mail/*http://br.maisbuscados.yahoo.com/esportes/">Esportes</a>