{"id":478,"date":"2017-03-23T18:01:02","date_gmt":"2017-03-23T21:01:02","guid":{"rendered":"http:\/\/pedrobertoleti.com.br\/?p=478"},"modified":"2024-12-22T02:50:03","modified_gmt":"2024-12-22T05:50:03","slug":"estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps","status":"publish","type":"post","link":"https:\/\/pedrobertoleti.com.br\/index.php\/2017\/03\/23\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\/","title":{"rendered":"Estimativa de contagem de pessoas com SimpleCV, Raspberry Pi e uma VPS"},"content":{"rendered":"<p style=\"text-align: justify;\">A vis\u00e3o computacional trata-se da uni\u00e3o de recursos tecnol\u00f3gicos para que m\u00e1quinas possam enxergar. O enxergar da vis\u00e3o computacional pode ser entendido como a busca por padr\u00f5es em imagens e streaming de v\u00eddeos, buscando assim caracter\u00edstica desejadas nas mesmas (detectar faces, olhos de rostos e bocas de rostos, por exemplo).<\/p>\n<p style=\"text-align: justify;\">Com o crescente ganho de tecnologia (sobretudo em processamento), as atuais <em>Single-Board Computers<\/em> t\u00eam poder computacional suficiente para realizarem tarefas de vis\u00e3o computacional.\u00a0E para ilustrar isso, este artigo mostra um projeto nesta linha: utilizar uma Webcam comum e um Raspberry Pi para detectar faces em um streaming de v\u00eddeo, de modo a contabilizar o n\u00famero de pessoas em um certo ambiente. Al\u00e9m disso, o projeto ir\u00e1 se integrar a uma VPS (Virtual Private Server) para contabilizar\u00a0o n\u00famero m\u00e9dio de pessoas contabilizadas por per\u00edodo do dia e utilizar como interface com o usu\u00e1rio um bot <a href=\"https:\/\/www.google.com.br\/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=0ahUKEwj9lKalhO3SAhWDlJAKHcB5ASAQFggaMAA&amp;url=https%3A%2F%2Ftelegram.org%2F&amp;usg=AFQjCNFKVwj_TnUWOxeJw2Vdu1NhzxihzA&amp;sig2=MQ9WQa7eERYJuiwj_AKBcQ&amp;bvm=bv.150475504,bs.1,d.Y2I\">Telegram<\/a>.<\/p>\n<p style=\"text-align: justify;\">Antes de prosseguir com o artigo, gostaria de deixar aqui um agradecimento ao meu patrocinador Digital Ocean, o qual me deu acesso a uma VPS e permitiu que este projeto virasse realidade.<\/p>\n<p style=\"text-align: justify;\"><a href=\"https:\/\/www.digitalocean.com\/\"><img decoding=\"async\" class=\"size-medium wp-image-485 aligncenter\" src=\"http:\/\/pedrobertoleti.com.br\/wp-content\/uploads\/2017\/03\/DigitalOceanLogoPNG-300x51.png\" alt=\"\" width=\"300\" height=\"51\" srcset=\"https:\/\/pedrobertoleti.com.br\/wp-content\/uploads\/2017\/03\/DigitalOceanLogoPNG-300x51.png 300w, https:\/\/pedrobertoleti.com.br\/wp-content\/uploads\/2017\/03\/DigitalOceanLogoPNG-192x33.png 192w, https:\/\/pedrobertoleti.com.br\/wp-content\/uploads\/2017\/03\/DigitalOceanLogoPNG.png 603w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<h2 style=\"text-align: justify;\">Materiais, servi\u00e7os e conhecimentos necess\u00e1rios<\/h2>\n<p style=\"text-align: justify;\">Para reproduzir o projeto deste artigo, ser\u00e3o necess\u00e1rios os seguintes materiais, conhecimentos e servi\u00e7os:<\/p>\n<ul>\n<li style=\"text-align: justify;\">Uma Raspberry Pi 3 model B<\/li>\n<li style=\"text-align: justify;\">Uma webcam USB comum<\/li>\n<li style=\"text-align: justify;\">Fonte de alimenta\u00e7\u00e3o 5V \/ 2A<\/li>\n<li style=\"text-align: justify;\">Disponibilidade de conex\u00e3o wireless \u00e0 Internet para a Raspberry Pi<\/li>\n<li style=\"text-align: justify;\">Uma conta \/ servi\u00e7o de VPS. Recomenda\u00e7\u00e3o: <a href=\"https:\/\/www.digitalocean.com\/\">Digital Ocean<\/a><\/li>\n<li style=\"text-align: justify;\">Conhecimentos b\u00e1sicos de Linux embarcado<\/li>\n<li style=\"text-align: justify;\">Conhecimentos b\u00e1sicos de linguagem de programa\u00e7\u00e3o Python<\/li>\n<li style=\"text-align: justify;\">No\u00e7\u00f5es b\u00e1sicas de MQTT<\/li>\n<\/ul>\n<h2>Recomenda\u00e7\u00e3o de lojas para o hardware<\/h2>\n<p>Segue abaixo algumas recomenda\u00e7\u00f5es de locais para adquirir o hardware para este projeto<\/p>\n<ul>\n<li><a href=\"https:\/\/amzn.to\/3ZNynhB\" target=\"_blank\" rel=\"noopener\">Raspberry Pi 4 &#8211; 4GB<\/a><\/li>\n<li><a href=\"https:\/\/amzn.to\/4gtRowE\" target=\"_blank\" rel=\"noopener\">Webcam Logitech c920<\/a><\/li>\n<li><a href=\"https:\/\/amzn.to\/4gNMYk8\" target=\"_blank\" rel=\"noopener\">Fonte de alimenta\u00e7\u00e3o para Raspberry Pi 4<\/a><\/li>\n<\/ul>\n<h2>Instala\u00e7\u00e3o do SimpleCV na Raspberry Pi<\/h2>\n<p style=\"text-align: justify;\">O <a href=\"http:\/\/simplecv.org\/\">SimpleCV<\/a> trata-se de um framework open-source de computa\u00e7\u00e3o visual. Comparativamente com o <a href=\"http:\/\/docs.opencv.org\/trunk\/index.html\">OpenCV<\/a>, trata-se de um framework de vis\u00e3o computacional mais simples, por\u00e9m\u00a0adequado \u00e0 maioria das necessidades desta \u00e1rea. Devido a sua f\u00e1cil\u00a0integra\u00e7\u00e3o com Python, tornou-se um framework muito popular.<\/p>\n<p style=\"text-align: justify;\">Para instalar o SimpleCV na Raspbery Pi, siga o procedimento abaixo:<\/p>\n<ol>\n<li style=\"text-align: justify;\">Instale as ferramentas e depend\u00eancias do SimpleCV com os comandos abaixo:\n<pre class=\"lang:sh decode:true\">sudo apt-get install python-opencv python-scipy python-numpy python-pip\nsudo pip install svgwrite<\/pre>\n<\/li>\n<li style=\"text-align: justify;\">Instale o SimpleCV com o comando abaixo:\n<pre class=\"lang:sh decode:true \">sudo pip install https:\/\/github.com\/ingenuitas\/SimpleCV\/zipball\/master<\/pre>\n<h2>Teste do SimpleCV<\/h2>\n<\/li>\n<\/ol>\n<p>Uma vez instalado o SimpleCV, este pode ser testado da maneira descrita a seguir. Antes de executar o procedimento, certifique-se que a webcam USB est\u00e1 ligada na Raspberry Pi.<\/p>\n<ol>\n<li>No terminal, crie um arquivo de script Python com o seguinte comando:\n<pre class=\"lang:sh decode:true \">nano TesteSimpleCV.py<\/pre>\n<\/li>\n<li>No editor de texto nano, cole o seguinte conte\u00fado:\n<pre class=\"lang:python decode:true \">from  SimpleCV import Camera\nc=Camera()\nc.live()\n<\/pre>\n<\/li>\n<li>Pressione Ctl+X e salve o arquivo. Para executar, utilize o seguinte comando:\n<pre class=\"lang:sh decode:true \">python TesteSimpleCV.py<\/pre>\n<\/li>\n<li>Se o teste for bem sucedido, uma janela ir\u00e1 surgir, exibindo nela a imagem que a webcam est\u00e1 capturando.<\/li>\n<\/ol>\n<h2>Detec\u00e7\u00e3o de face<\/h2>\n<p style=\"text-align: justify;\">Com o SimpleCV e webcam funcionando, podemos partir para a detec\u00e7\u00e3o de faces. Para tal tarefa, \u00e9 utilizado um recurso do SimpleCV chamado\u00a0&#8220;Haar Feature-based Cascade Classifier for Object Detection&#8221;. Este recurso permite encontrar caracter\u00edsticas em uma imagem (seja uma foto ou stream de v\u00eddeo), a fim de encontrar objetos caracter\u00edsticos na mesma.<\/p>\n<p style=\"text-align: justify;\">O &#8220;input&#8221; deste recurso s\u00e3o os chamados &#8220;Cascade classified files&#8221;. Cada arquivo destes tem formato xml e descreve como s\u00e3o os objetos que devem encontrar. Portanto, quanto mais detalhado o objeto a ser encontrado, mais complexo ser\u00e1 este xml. O SimpleCV j\u00e1 conta por padr\u00e3o com alguns\u00a0Cascade classified files, o que ir\u00e1 facilitar muito seu aprendizado e seus primeiros projetos.\u00a0Um deles \u00e9 o Cascade classified file de face (ou seja, permite detectar a presen\u00e7a de uma face humana em uma foto ou stream de video).\u00a0Para saber mais, clique <a href=\"http:\/\/docs.opencv.org\/2.4\/modules\/objdetect\/doc\/cascade_classification.html\">aqui<\/a>.<\/p>\n<p style=\"text-align: justify;\">Portanto, para identificar faces com base na imagem capturada pela webcam, utilize o script Python abaixo:<\/p>\n<pre class=\"lang:python decode:true \">from SimpleCV import * \n\n#inicializacao da camera\ncam = Camera() \n\nwhile True:\n\timagem = cam.getImage().scale(1) #pega a imagem da webcam no tamanho maximo que ela pode gerar\n\n\tfaces = imagem.findHaarFeatures('face.xml') #procura por faces humanas na imagem capturada da webcam\n\n        #se existir faces humanas na imagem, estas s\u00e3o destacadas com um retangulo (cor default: verde) \n\tif faces:\n\t    faces.draw() \n\t    print \"- Numero de faces encontradas: \"+str(len(faces))\t\n\n        imagem.show() #mostra a imagem (e a face destacada, caso existir)<\/pre>\n<p>Salve o script como <strong>DeteccaoFaces.py<\/strong> e execute o programa com o seguinte comando:<\/p>\n<pre class=\"lang:python decode:true\">python DeteccaoFaces.py<\/pre>\n<p style=\"text-align: justify;\">Pronto, agora basta ficar na frente da webcam e observar a detec\u00e7\u00e3o de sua face! Uma brincadeira interessante \u00e9 voc\u00ea segurar uma foto com uma ou mais pessoas ao mesmo tempo em que \u00e9 &#8220;visto&#8221; pela webcam. O script ir\u00e1 encontrar a sua face e as da foto ao mesmo tempo, assim voc\u00ea consegue ver o funcionamento da detec\u00e7\u00e3o de face a todo vapor.<\/p>\n<p style=\"text-align: justify;\"><span style=\"color: #ff0000;\"><strong>IMPORTANTE:<\/strong><\/span> o Cascade classified file de face (face.xml) est\u00e1 preparado \u00a0para detec\u00e7\u00e3o de faces &#8220;filmadas&#8221; de forma frontal. Ou seja, sua efici\u00eancia de detec\u00e7\u00e3o \u00e9 reduzida em casos de faces em outras posi\u00e7\u00f5es (vistas de cima ou de perfil, por exemplo).<\/p>\n<h2 style=\"text-align: justify;\">Contabilizando pessoas e guardando os dados em uma VPS<\/h2>\n<p style=\"text-align: justify;\">A partir de agora, ser\u00e1 explicado como detectar faces, contabiliz\u00e1-las e enviar a contabiliza\u00e7\u00e3o a uma VPS. Desta forma, ser\u00e1 feito um mecanismo para armazenar qual a m\u00e9dia de pessoas contabilizadas por per\u00edodo do dia (per\u00edodos de 1 hora cada).<\/p>\n<p style=\"text-align: justify;\">Antes de tudo, \u00e9 preciso preparar sua VPS para suportar sistema de banco de dados sqlite3 e instalar um broker MQTT Mosquitto nela. O sistema de banco de dados ser\u00e1 respons\u00e1vel por gerenciar a tabela que cont\u00e9m o registro das contagens (por per\u00edodo), enquanto a comunica\u00e7\u00e3o entre\u00a0Raspberry Pi e VPS ser\u00e1 feita por MQTT.<\/p>\n<p style=\"text-align: justify;\"><span style=\"color: #ff0000;\"><strong>Observa\u00e7\u00e3o:<\/strong><\/span> Para poder utilizar MQTT e Python na Raspberry Pi, \u00e9 necess\u00e1rio instalar a biblioteca Paho-MQTT. Para saber como fazer isso, veja este <a href=\"https:\/\/www.embarcados.com.br\/raspberry-pi-3-na-iot-mqtt-e-python\/\">artigo<\/a>.<\/p>\n<p style=\"text-align: justify;\">Para uma\u00a0VPS Digital Ocean com sistema operacional Linux Ubuntu 16.04, isso pode ser feito das seguintes maneiras:<\/p>\n<ul>\n<li style=\"text-align: justify;\">Instala\u00e7\u00e3o do broker MQTT Mosquitto: clique <a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-install-and-secure-the-mosquitto-mqtt-messaging-broker-on-ubuntu-16-04\">aqui<\/a><\/li>\n<li style=\"text-align: justify;\">Instala\u00e7\u00e3o do\u00a0sistema de banco de dados sqlite3: clique <a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-and-when-to-use-sqlite\">aqui<\/a><\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Feito isso, chegou a hora dos c\u00f3digos do lado da Raspberry Pi e da VPS.<\/p>\n<p style=\"text-align: justify;\">Do lado do servidor, fa\u00e7a o seguinte procedimento:<\/p>\n<ol style=\"text-align: justify;\">\n<li>Primeiramente, vamos fazer um script que manipula o banco de dados do nosso projeto. Ele ser\u00e1 respons\u00e1vel por inserir e ler registros do mesmo. Para isso, utilize o script Python abaixo:\n<pre class=\"lang:python decode:true \">#Modulo de manipulacao de banco de dados\n\nimport sqlite3\n\n#Funcao: cria (se ja nao existe) banco de dados e tabela\n#Parametros: nenhum\n#Retorno: nenhum\ndef InicializaBancoDeDados():\n\t\tconn = sqlite3.connect('ContadorPessoasBD.db')\n\t\tcursor = conn.cursor()\n\n\t\tcursor.execute(\"\"\"\n\t\t    CREATE TABLE IF NOT EXISTS ContadorPessoas (\n        \t\tId INTEGER NOT NULL,\n\t\t\tDataHora TIMESTAMP DEFAULT NOW,\n\t      \t\tPeriodo1 FLOAT NOT NULL default 0,\n\t        \tPeriodo2 FLOAT NOT NULL default 0,\n\t        \tPeriodo3 FLOAT NOT NULL default 0,\n\t        \tPeriodo4 FLOAT NOT NULL default 0,\n\t        \tPeriodo5 FLOAT NOT NULL default 0,\n\t        \tPeriodo6 FLOAT NOT NULL default 0,\n\t        \tPeriodo7 FLOAT NOT NULL default 0,\n\t        \tPeriodo8 FLOAT NOT NULL default 0,\n\t        \tPeriodo9 FLOAT NOT NULL default 0,\n\t        \tPeriodo10 FLOAT NOT NULL default 0,\n\t        \tPeriodo11 FLOAT NOT NULL default 0,\n\t        \tPeriodo12 FLOAT NOT NULL default 0,\n\t        \tPeriodo13 FLOAT NOT NULL default 0,\n\t        \tPeriodo14 FLOAT NOT NULL default 0,\n\t        \tPeriodo15 FLOAT NOT NULL default 0,\n\t        \tPeriodo16 FLOAT NOT NULL default 0,\n\t        \tPeriodo17 FLOAT NOT NULL default 0,\n\t        \tPeriodo18 FLOAT NOT NULL default 0,\n\t        \tPeriodo19 FLOAT NOT NULL default 0,\n\t        \tPeriodo20 FLOAT NOT NULL default 0,\n\t        \tPeriodo21 FLOAT NOT NULL default 0,\n\t        \tPeriodo22 FLOAT NOT NULL default 0,\n\t        \tPeriodo23 FLOAT NOT NULL default 0,\n\t        \tPeriodo24 FLOAT NOT NULL default 0\n\t     \t);\n\t\t\"\"\")\n\n\t\t#cria linha\n\t\tcursor.execute(\"\"\"\n\t\t\tINSERT INTO ContadorPessoas (Id) VALUES (1)\n\t\t\"\"\")\n\n\t\tconn.commit()\n\t\tconn.close()\n\t\tprint('Tabela de contagem criada com sucesso.')\n\n\t\treturn\n\n\n#Funcao: registra contagem\n#Parametros: Periodo a ser registrado (0 - 23)\n#            Valor da contagem\n#Retorno: nenhum\ndef RegistraContagem(Periodo, ValorDT):\n\tPeriodoBD = Periodo + 1 #Desta forma, o range de periodo passa a 1 -&gt; 24\n\tNomeCampo = \"Periodo\"+str(PeriodoBD)\n\n\tconn = sqlite3.connect('ContadorPessoasBD.db')\n\tcursor = conn.cursor()\n\n\tQueryBD = \"UPDATE ContadorPessoas SET \"+NomeCampo+\" = \"+NomeCampo+\" + \"+ValorDT\n\n\tcursor.execute(QueryBD)\n\tconn.commit()\n\tconn.close()\n\treturn\n\n#Funcao: retorna todos os registros de contagem de pessoas por periodo\n#Parametros: nenhum\n#Retorno: string com todos as contagens por periodo\ndef LeRegistrosContagemPessoas():\n\tconn = sqlite3.connect('ContadorPessoasBD.db')\n\tcursor = conn.cursor()\n\n\tQueryBD = \"SELECT * FROM ContadorPessoas\"\n\tcursor.execute(QueryBD)\n\n\tStringRetorno=\"Contagem de pessoas: \\n\"\n\tResultadoSelect = cursor.fetchall()\n\tfor campo in  ResultadoSelect:\n\t\tStringRetorno = StringRetorno + \"De 0h ate 1h: \" +str(campo[2])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 1h ate 2h: \" +str(campo[3])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 2h ate 3h: \" +str(campo[4])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 3h ate 4h: \" +str(campo[5])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 4h ate 5h: \" +str(campo[6])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 5h ate 6h: \" +str(campo[7])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 6h ate 7h: \" +str(campo[8])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 7h ate 8h: \" +str(campo[9])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 9h ate 10h: \" +str(campo[10])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 10h ate 11h: \" +str(campo[11])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 11h ate 12h: \" +str(campo[12])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 12h ate 13h: \" +str(campo[13])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 13h ate 14h: \" +str(campo[14])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 14h ate 15h: \" +str(campo[15])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 15h ate 16h: \" +str(campo[16])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 16h ate 17h: \" +str(campo[17])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 17h ate 18h: \" +str(campo[18])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 18h ate 19h: \" +str(campo[19])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 19h ate 20h: \" +str(campo[20])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 20h ate 21h: \" +str(campo[21])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 21h ate 22h: \" +str(campo[22])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 22h ate 23h: \" +str(campo[23])+\"\\n\"\n\t\tStringRetorno = StringRetorno + \"De 23h ate 0h: \" +str(campo[24])+\"\\n\"\n\n\n\treturn StringRetorno\n<\/pre>\n<p>Salve-o como <strong>ManipulacaoBancoDadosContadorPessoas.py<\/strong>.<\/li>\n<li>Agora, faremos o &#8220;rob\u00f4&#8221;, o qual consiste em um script Python respons\u00e1vel por receber dados das contagens e solicitar ao script de manipula\u00e7\u00e3o de banco de dados que os insira no banco de dados do projeto. Tal script dever\u00e1 rodar de modo permanente \/ em background na VPS.<br \/>\nO c\u00f3digo-fonte deste rob\u00f4 est\u00e1 a seguir.<\/p>\n<pre class=\"lang:python decode:true  \">import paho.mqtt.client as mqtt\nimport time\nimport datetime\nimport os\nfrom ManipulacaoBancoDadosContadorPessoas import RegistraContagem\nfrom ManipulacaoBancoDadosContadorPessoas import InicializaBancoDeDados\n\n#definicoes:\nBroker = \"III.III.III.III\"  #coloque aqui o IP de sua VPS\nPortaBroker = 1883\nKeepAliveBroker = 60\nTopicoSub = \"MQTTRegistrarContagemPessoas\"\nTimeoutConexao = 5\n\n#Callback - conexao ao broker realizada\ndef on_connect(client, userdata, flags, rc):\n        print(\"[STATUS] Conectado ao Broker. Resultado de conexao: \"+str(rc))\n        client.subscribe(TopicoSub)\n\treturn\n\n#Callback - mensagem recebida do broker\ndef on_message(client, userdata, msg):\n        MensagemRecebida = str(msg.payload)\n\tprint(\"[MSG RECEBIDA] Contagem de pessoas: \"+MensagemRecebida)\n\n\tValorCT = MensagemRecebida\n\n\t#obtem periodo atual\n\tnow = datetime.datetime.now()\n\tPeriodo = now.hour\n\n\t#registra no banco de dados\n\tRegistraContagem(Periodo,ValorCT)\n        return\n\n\n#----------------------\n#  PROGRAMA PRINCIPAL\n#----------------------\n\nos.system(\"clear\")\nif not os.path.isfile('ContadorPessoasBD.db'):\n        InicializaBancoDeDados()\n\nprint(\"[STATUS] Inicializando MQTT...\")\nclient = mqtt.Client()\nclient.on_connect = on_connect\nclient.on_message = on_message\nclient.connect(Broker, PortaBroker, KeepAliveBroker)\n\nwhile True:\n     StatusConexaoBroker = client.loop(TimeoutConexao)\n\n     if (StatusConexaoBroker &gt; 0):\n         client.connect(Broker, PortaBroker, KeepAliveBroker)\n<\/pre>\n<p>Salve-o como\u00a0<strong>RoboContagemPessoasBD.py<\/strong><\/li>\n<li>Coloque o rob\u00f4 para rodarem modo permanente \/ em background com o comando a seguir. Uma vez executado o comando, voc\u00ea pode fechar sua sess\u00e3o SSH com a VPS que este continuar\u00e1 rodando conforme desejado.\n<pre class=\"lang:sh decode:true \">python RoboContagemPessoasBD.py &amp;<\/pre>\n<\/li>\n<li>Pronto! Para verificar se seu rob\u00f4 est\u00e1 rodando, basta utilizar o comando abaixo e verificar a execu\u00e7\u00e3o do mesmo na lista de processos.\n<pre class=\"lang:sh decode:true \">ps aux<\/pre>\n<\/li>\n<\/ol>\n<p style=\"text-align: justify;\">J\u00e1 do lado da Raspberry Pi, fa\u00e7a o seguinte:<\/p>\n<ol>\n<li style=\"text-align: justify;\">O script para detec\u00e7\u00e3o de faces (j\u00e1 preparado para o envio das informa\u00e7\u00f5es a VPS) pode ser visto a seguir:\n<pre class=\"lang:python decode:true \">from SimpleCV import * \nimport time\nimport paho.mqtt.client as mqtt\n\n#variaveis globais\nTimeoutConexao = 5  #Timeout da conexao com broker\nTopicoPublisher = \"MQTTRegistrarContagemPessoas\"   #topico usado para enviar dados ao broker\nBroker = \"III.III.III.III\"   #coloque aqui o IP de sua VPS\nPortaBroker = \"1883\"\nTotalFacesReconhecidas = 0\nTotalLeiturasFaces = 0\nTempoEntreEnvios = 3600  #3600s = 1h\n\n#Funcao: callback de conexao ao broker\n#Parametros: objetos e flags de conexao\n#Retorno: nenhum\ndef on_connect(client, userdata, flags, rc):\n    print(\"Conectado ao broker. Retorno da conexao: \"+str(rc))\n    return\n\n\t\n#PROGRAMA PRINCIPAL\nclient = mqtt.Client()\nclient.on_connect = on_connect  #configura callback (de quando eh estabelecida a conexao)\nclient.connect(Broker, PortaBroker, 60) \n\n#inicializacao da camera\ncam = Camera() \n\n#inicializcao da variavel de controle de envio de informacoes\nTempoInicialSegundos=int(time.time())\n\nwhile True:\n\timagem = cam.getImage().scale(1)\n\n\tfaces = imagem.findHaarFeatures('face.xml')\n\tif faces:\n\t    faces.draw() \n\t    imagem.show() #mostra o resultado\n\t    print \"- Faces encontradas: \"+str(len(faces))\t\n\t    TotalFacesReconhecidas = TotalFacesReconhecidas + len(faces)\n\t    TotalLeiturasFaces = TotalLeiturasFaces + 1\n\n\n\t#verifica se deve enviar valor da contagem media ao servidor\n\tTempoAtualSegundos = int(time.time())\n\tif ((TempoAtualSegundos-TempoInicialSegundos) &gt; TempoEntreEnvios):\n\t\tMediaPessoas = int(TotalFacesReconhecidas \/ TotalLeiturasFaces)\n\n\t\tStatusConexaoBroker = client.loop(TimeoutConexao)\n\t\tif (StatusConexaoBroker &gt; 0):\n\t\t\tclient.connect(Broker, PortaBroker, 60)\n\n\t\tclient.publish(TopicoPublisher, str(MediaPessoas))\n\t\tTotalFacesReconhecidas = 0\n\t\tTotalLeiturasFaces = 0\n\t\tTempoInicialSegundos=int(time.time())\n\t\n<\/pre>\n<p>Salve-o como\u00a0<strong>DeteccaoFaceVPS.py<\/strong><\/li>\n<li style=\"text-align: justify;\">Execute o script com o comando abaixo:\n<pre class=\"lang:sh decode:true \">python DeteccaoFaceVPS.py<\/pre>\n<\/li>\n<li style=\"text-align: justify;\">Est\u00e1 feito! Agora basta colocar seu sistema composto por Raspberry Pi + webcam em algum ponto onde deseja contar o n\u00famero m\u00e9dio de pessoas por hora e a Raspbery Pi e a VPS fazem o resto!<\/li>\n<\/ol>\n<h2>B\u00f4nus: interface pelo Telegram<\/h2>\n<p style=\"text-align: justify;\">Sabe o Telegram? Isso mesmo, aquele app \/ servi\u00e7o de mensagens instant\u00e2neas (que normalmente lembramos quando o WhatsApp est\u00e1 fora do ar). Que tal saber as estat\u00edsticas de contagem de pessoas atrav\u00e9s dele, conversando com um bot que roda na sua VPS? Isso \u00e9 poss\u00edvel e vamos faz\u00ea-lo aqui!<\/p>\n<p style=\"text-align: justify;\">Primeiramente, \u00e9 necess\u00e1rio criar um token para seu bot Telegram. isso \u00e9 feito conversando com um bot chamado The BotFather no Telegram e seguido estas instru\u00e7\u00f5es <a href=\"https:\/\/www.google.com.br\/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=0ahUKEwjVqbOwwe3SAhXHkJAKHQ41CSEQFggaMAA&amp;url=https%3A%2F%2Fcore.telegram.org%2Fbots&amp;usg=AFQjCNHVRsV8gTtcyHY3rIwSOHqtLWazlg&amp;sig2=wu6uZltfnHydRQe7CWTSMw\">aqui<\/a>.<\/p>\n<p style=\"text-align: justify;\">Em seguida, \u00e9 preciso instalar as bibliotecas para interagir com o telegram a partir do Python. Fa\u00e7a isso com o seguinte comando:<\/p>\n<pre class=\"lang:python decode:true \">sudo apt-get install python-telegram-bot<\/pre>\n<p>Uma vez criado o bot e com seu token em m\u00e3os, coloque o seguinte c\u00f3digo Python na sua VPS (salve-o como\u00a0<strong>TelegramCP.py<\/strong>):<\/p>\n<pre class=\"lang:python decode:true \">import telegram\t\t\t\nfrom time import sleep \nfrom urllib2 import URLError\nfrom ManipulacaoBancoDadosContadorPessoas import LeRegistrosContagemPessoas\n\ndef DTBot(bot, update_id):\n    for update in bot.getUpdates(offset=update_id, timeout=10):\n        chat_id = update.message.chat_id\n        update_id = update.update_id + 1\n        message = update.message.text\n\n        if message:\n           EnviarResposta(message, bot, chat_id) \n\n    return update_id\n\ndef EnviarResposta(Msg,BotObj,ChatID):\n\tMsgLowerCase = Msg.lower()\n\n\tif (MsgLowerCase == \"oi\"):\n\t\tBotObj.sendMessage(chat_id=ChatID, text=\"Ola! Ja irei te enviar as estatisticas de contagem de pessoas. Aguarde um instante, por favor.\")\n\t\tCPRegistrados = LeRegistrosContagemPessoas()\n\t\tBotObj.sendMessage(chat_id=ChatID, text=CPRegistrados)\n\n\treturn\n\n#MAIN PROGRAM\nupdate_id = None\nBotToken = 'TTTTTTTTTTTTTTTTTTTTT' #coloque aqui sua token obtida com o BotFather\n\nbot = telegram.Bot(BotToken)\nprint 'BOT ONLINE!!!'\n\nwhile True:\n        try:\n            update_id = DTBot(bot, update_id)\n        except telegram.TelegramError as e:\n            if e.message in (\"Bad Gateway\", \"Timed out\"):\n                sleep(1)\n            else: \n                raise e\n        except URLError as e:\n            sleep(1)\n\n<\/pre>\n<p style=\"text-align: justify;\">Agora execute-o com o seguinte comando (assim, ele rodar\u00e1 em background \/ de modo permanente):<\/p>\n<pre class=\"lang:default decode:true \">python TelegramCP.py &amp;<\/pre>\n<p style=\"text-align: justify;\">Pronto! Pode fechar sua sess\u00e3o SSH com a sua VPS e usar o Telegram para acompanhar tudo! Basta enviar a palavra <strong>oi<\/strong> para seu bot que ele lhe informa as estat\u00edsticas.<\/p>\n<p style=\"text-align: justify;\">Gostou do artigo? Tem d\u00favidas? Tem cr\u00edticas? Comente abaixo!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A vis\u00e3o computacional trata-se da uni\u00e3o de recursos tecnol\u00f3gicos para que m\u00e1quinas possam enxergar. O enxergar da vis\u00e3o computacional pode ser entendido como a busca por padr\u00f5es em imagens e streaming de v\u00eddeos, buscando assim caracter\u00edstica desejadas nas mesmas (detectar faces, olhos de rostos e bocas de rostos, por exemplo). Com o crescente ganho de&#8230;<\/p>\n","protected":false},"author":1,"featured_media":479,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[9,6,12,13,5],"tags":[],"class_list":["post-478","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","category-iot","category-nivel-avancado","category-publicacoes","category-artigos-nacionais"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Estimativa de contagem de pessoas com SimpleCV, Raspberry Pi e uma VPS -<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/pedrobertoleti.com.br\/index.php\/2017\/03\/23\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Estimativa de contagem de pessoas com SimpleCV, Raspberry Pi e uma VPS -\" \/>\n<meta property=\"og:description\" content=\"A vis\u00e3o computacional trata-se da uni\u00e3o de recursos tecnol\u00f3gicos para que m\u00e1quinas possam enxergar. O enxergar da vis\u00e3o computacional pode ser entendido como a busca por padr\u00f5es em imagens e streaming de v\u00eddeos, buscando assim caracter\u00edstica desejadas nas mesmas (detectar faces, olhos de rostos e bocas de rostos, por exemplo). Com o crescente ganho de...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/pedrobertoleti.com.br\/index.php\/2017\/03\/23\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\/\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/pbertoleti\" \/>\n<meta property=\"article:published_time\" content=\"2017-03-23T21:01:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-12-22T05:50:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/pedrobertoleti.com.br\/wp-content\/uploads\/2017\/03\/Multidao.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"700\" \/>\n\t<meta property=\"og:image:height\" content=\"466\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Pedro Bertoleti\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@pedro_bertoleti\" \/>\n<meta name=\"twitter:site\" content=\"@pedro_bertoleti\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Pedro Bertoleti\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/index.php\\\/2017\\\/03\\\/23\\\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/index.php\\\/2017\\\/03\\\/23\\\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\\\/\"},\"author\":{\"name\":\"Pedro Bertoleti\",\"@id\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/#\\\/schema\\\/person\\\/fe1c150103c09ca0a2b9bb200bef33de\"},\"headline\":\"Estimativa de contagem de pessoas com SimpleCV, Raspberry Pi e uma VPS\",\"datePublished\":\"2017-03-23T21:01:02+00:00\",\"dateModified\":\"2024-12-22T05:50:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/index.php\\\/2017\\\/03\\\/23\\\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\\\/\"},\"wordCount\":1410,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/index.php\\\/2017\\\/03\\\/23\\\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/wp-content\\\/uploads\\\/2017\\\/03\\\/Multidao.jpg\",\"articleSection\":[\"Blog\",\"IoT\",\"N\u00edvel avan\u00e7ado\",\"Publica\u00e7\u00f5es\",\"publica\u00e7\u00f5es nacionais\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/pedrobertoleti.com.br\\\/index.php\\\/2017\\\/03\\\/23\\\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/index.php\\\/2017\\\/03\\\/23\\\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\\\/\",\"url\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/index.php\\\/2017\\\/03\\\/23\\\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\\\/\",\"name\":\"Estimativa de contagem de pessoas com SimpleCV, Raspberry Pi e uma VPS -\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/index.php\\\/2017\\\/03\\\/23\\\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/index.php\\\/2017\\\/03\\\/23\\\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/wp-content\\\/uploads\\\/2017\\\/03\\\/Multidao.jpg\",\"datePublished\":\"2017-03-23T21:01:02+00:00\",\"dateModified\":\"2024-12-22T05:50:03+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/#\\\/schema\\\/person\\\/fe1c150103c09ca0a2b9bb200bef33de\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/index.php\\\/2017\\\/03\\\/23\\\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/pedrobertoleti.com.br\\\/index.php\\\/2017\\\/03\\\/23\\\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/index.php\\\/2017\\\/03\\\/23\\\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\\\/#primaryimage\",\"url\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/wp-content\\\/uploads\\\/2017\\\/03\\\/Multidao.jpg\",\"contentUrl\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/wp-content\\\/uploads\\\/2017\\\/03\\\/Multidao.jpg\",\"width\":700,\"height\":466},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/index.php\\\/2017\\\/03\\\/23\\\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Estimativa de contagem de pessoas com SimpleCV, Raspberry Pi e uma VPS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/#website\",\"url\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/\",\"name\":\"\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/pedrobertoleti.com.br\\\/#\\\/schema\\\/person\\\/fe1c150103c09ca0a2b9bb200bef33de\",\"name\":\"Pedro Bertoleti\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/76ea2e908fec70b0d55b4eefd5ab24788f573fbe00bcb7b7d6e37da8f1e18dd3?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/76ea2e908fec70b0d55b4eefd5ab24788f573fbe00bcb7b7d6e37da8f1e18dd3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/76ea2e908fec70b0d55b4eefd5ab24788f573fbe00bcb7b7d6e37da8f1e18dd3?s=96&d=mm&r=g\",\"caption\":\"Pedro Bertoleti\"},\"description\":\"Informa\u00e7\u00f5es completas em: http:\\\/\\\/pedrobertoleti.com.br\\\/index.php\\\/sobre\\\/\",\"sameAs\":[\"http:\\\/\\\/www.pedrobertoleti.com.br\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Estimativa de contagem de pessoas com SimpleCV, Raspberry Pi e uma VPS -","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/pedrobertoleti.com.br\/index.php\/2017\/03\/23\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\/","og_locale":"pt_BR","og_type":"article","og_title":"Estimativa de contagem de pessoas com SimpleCV, Raspberry Pi e uma VPS -","og_description":"A vis\u00e3o computacional trata-se da uni\u00e3o de recursos tecnol\u00f3gicos para que m\u00e1quinas possam enxergar. O enxergar da vis\u00e3o computacional pode ser entendido como a busca por padr\u00f5es em imagens e streaming de v\u00eddeos, buscando assim caracter\u00edstica desejadas nas mesmas (detectar faces, olhos de rostos e bocas de rostos, por exemplo). Com o crescente ganho de...","og_url":"https:\/\/pedrobertoleti.com.br\/index.php\/2017\/03\/23\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\/","article_publisher":"https:\/\/www.facebook.com\/pbertoleti","article_published_time":"2017-03-23T21:01:02+00:00","article_modified_time":"2024-12-22T05:50:03+00:00","og_image":[{"width":700,"height":466,"url":"https:\/\/pedrobertoleti.com.br\/wp-content\/uploads\/2017\/03\/Multidao.jpg","type":"image\/jpeg"}],"author":"Pedro Bertoleti","twitter_card":"summary_large_image","twitter_creator":"@pedro_bertoleti","twitter_site":"@pedro_bertoleti","twitter_misc":{"Escrito por":"Pedro Bertoleti","Est. tempo de leitura":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/pedrobertoleti.com.br\/index.php\/2017\/03\/23\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\/#article","isPartOf":{"@id":"https:\/\/pedrobertoleti.com.br\/index.php\/2017\/03\/23\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\/"},"author":{"name":"Pedro Bertoleti","@id":"https:\/\/pedrobertoleti.com.br\/#\/schema\/person\/fe1c150103c09ca0a2b9bb200bef33de"},"headline":"Estimativa de contagem de pessoas com SimpleCV, Raspberry Pi e uma VPS","datePublished":"2017-03-23T21:01:02+00:00","dateModified":"2024-12-22T05:50:03+00:00","mainEntityOfPage":{"@id":"https:\/\/pedrobertoleti.com.br\/index.php\/2017\/03\/23\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\/"},"wordCount":1410,"commentCount":0,"image":{"@id":"https:\/\/pedrobertoleti.com.br\/index.php\/2017\/03\/23\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\/#primaryimage"},"thumbnailUrl":"https:\/\/pedrobertoleti.com.br\/wp-content\/uploads\/2017\/03\/Multidao.jpg","articleSection":["Blog","IoT","N\u00edvel avan\u00e7ado","Publica\u00e7\u00f5es","publica\u00e7\u00f5es nacionais"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/pedrobertoleti.com.br\/index.php\/2017\/03\/23\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/pedrobertoleti.com.br\/index.php\/2017\/03\/23\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\/","url":"https:\/\/pedrobertoleti.com.br\/index.php\/2017\/03\/23\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\/","name":"Estimativa de contagem de pessoas com SimpleCV, Raspberry Pi e uma VPS -","isPartOf":{"@id":"https:\/\/pedrobertoleti.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/pedrobertoleti.com.br\/index.php\/2017\/03\/23\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\/#primaryimage"},"image":{"@id":"https:\/\/pedrobertoleti.com.br\/index.php\/2017\/03\/23\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\/#primaryimage"},"thumbnailUrl":"https:\/\/pedrobertoleti.com.br\/wp-content\/uploads\/2017\/03\/Multidao.jpg","datePublished":"2017-03-23T21:01:02+00:00","dateModified":"2024-12-22T05:50:03+00:00","author":{"@id":"https:\/\/pedrobertoleti.com.br\/#\/schema\/person\/fe1c150103c09ca0a2b9bb200bef33de"},"breadcrumb":{"@id":"https:\/\/pedrobertoleti.com.br\/index.php\/2017\/03\/23\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/pedrobertoleti.com.br\/index.php\/2017\/03\/23\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/pedrobertoleti.com.br\/index.php\/2017\/03\/23\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\/#primaryimage","url":"https:\/\/pedrobertoleti.com.br\/wp-content\/uploads\/2017\/03\/Multidao.jpg","contentUrl":"https:\/\/pedrobertoleti.com.br\/wp-content\/uploads\/2017\/03\/Multidao.jpg","width":700,"height":466},{"@type":"BreadcrumbList","@id":"https:\/\/pedrobertoleti.com.br\/index.php\/2017\/03\/23\/estimativa-de-contagem-de-pessoas-com-simplecv-raspberry-pi-e-uma-vps\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/pedrobertoleti.com.br\/"},{"@type":"ListItem","position":2,"name":"Estimativa de contagem de pessoas com SimpleCV, Raspberry Pi e uma VPS"}]},{"@type":"WebSite","@id":"https:\/\/pedrobertoleti.com.br\/#website","url":"https:\/\/pedrobertoleti.com.br\/","name":"","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/pedrobertoleti.com.br\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/pedrobertoleti.com.br\/#\/schema\/person\/fe1c150103c09ca0a2b9bb200bef33de","name":"Pedro Bertoleti","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/secure.gravatar.com\/avatar\/76ea2e908fec70b0d55b4eefd5ab24788f573fbe00bcb7b7d6e37da8f1e18dd3?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/76ea2e908fec70b0d55b4eefd5ab24788f573fbe00bcb7b7d6e37da8f1e18dd3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/76ea2e908fec70b0d55b4eefd5ab24788f573fbe00bcb7b7d6e37da8f1e18dd3?s=96&d=mm&r=g","caption":"Pedro Bertoleti"},"description":"Informa\u00e7\u00f5es completas em: http:\/\/pedrobertoleti.com.br\/index.php\/sobre\/","sameAs":["http:\/\/www.pedrobertoleti.com.br"]}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/pedrobertoleti.com.br\/wp-content\/uploads\/2017\/03\/Multidao.jpg","_links":{"self":[{"href":"https:\/\/pedrobertoleti.com.br\/index.php\/wp-json\/wp\/v2\/posts\/478","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pedrobertoleti.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pedrobertoleti.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pedrobertoleti.com.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pedrobertoleti.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=478"}],"version-history":[{"count":29,"href":"https:\/\/pedrobertoleti.com.br\/index.php\/wp-json\/wp\/v2\/posts\/478\/revisions"}],"predecessor-version":[{"id":2152,"href":"https:\/\/pedrobertoleti.com.br\/index.php\/wp-json\/wp\/v2\/posts\/478\/revisions\/2152"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pedrobertoleti.com.br\/index.php\/wp-json\/wp\/v2\/media\/479"}],"wp:attachment":[{"href":"https:\/\/pedrobertoleti.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=478"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pedrobertoleti.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=478"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pedrobertoleti.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=478"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}