;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Não adianta disfarce: Face ID do iPhone faz reconhecimento facial profundo

Foto desbloqueia Galaxy S8 Plus

UOL Notícias

Bruna Souza Cruz

Do UOL, em São Paulo

19/01/2018 04h00

O lançamento do iPhone X marcou as comemorações de 10 anos da linha de celulares da Apple, mas não só isso. O novo modelo representou uma nova direção para o mundo dos smartphones ao trazer importantes mudanças técnicas e de design numa área que vinha apresentando poucos avanços nos últimos anos.

Muito se falou dos novos movimentos, do fim do botão home, da tela infinita e do preço (aqui custa a partir de R$ 6.999), mas é o reconhecimento facial, ou Face ID, um dos pontos mais inovadores.

Ele promete identificar o dono do iPhone pelo olhar e pela geometria do rosto e pretende ser muito mais seguro.

A configuração do recurso de desbloqueio do telefone é simples: você grava um pequeno vídeo do rosto, enquanto faz um movimento circular. Depois disso, basta dar uma olhada para o telefone, que ele desbloqueia. Não há necessidade de "encaixar os olhos", como ocorre no Galaxy S8.

Tem quem duvide, especialmente depois que uma criança desbloqueou o smartphone da mãe; irmãos gêmeos semelhantesenganaram o sistema e um cara teve problemas depois que tirou a barba— a Apple diz que as chances disso acontecer são maiores para gêmeos ou familiares muito parecidos, mas ainda sim a probabilidade é muita baixa e o sistema é muito mais seguro que a biometria.

Então, resolvemos testar. O iPhone X e seu Face ID foi usado durante um mês por três pessoas diferentes (eu e dois homens).

Conclusão: sim, o reconhecimento facial é seguro e funciona nas situações mais comuns já previstas pela Apple.

Ele funciona quando você está de chapéu, maquiagem, óculos de sol, diferentes estilos de cabelo, barba... Te reconhece em ambientes iluminados ou com pouca iluminação.

Ele só não conseguiu reconhecer o dono com máscara, como era de se esperar.

O mais interessante é que o Face ID não funcionou quando usamos uma foto do rosto para tentar burlar o sistema. Já havíamos feito o mesmo teste com o Galaxy S8 Plus, o modelo mais moderno da Samsung. E, surpresa! Conseguimos o desbloqueio.

Como funciona?

O Face ID funciona por causa de sua tecnologia que envolve o reconhecimento facial 3D. Ela utiliza vários sensores capazes de mapear cerca de 30 mil pontos do rosto do usuário criando um mapa de profundidade.

Ao posicionar o rosto em frente à tela e olhar para o celular, o Face ID faz uma varredura automática (que dura poucos segundos) nas informações salvas e verifica se ele deve ou não desbloquear a tela para o uso do telefone.

Segundo a Apple, é preciso que o usuário olhe para a tela. Caso contrário, o funcionamento do Face ID talvez não seja tão preciso. Em alguns casos, até conseguimos desbloquear a tela mesmo com o aparelho na lateral de nosso rosto. Mas quando tentamos com os olhos fechados, não funcionou.

O Face ID também tem outros usos interessantes. Ele substitui a autenticação de aplicações que até então utilizavam senhas ou o sensor de digital, ou seja, você a a usar seu rosto para fazer compras na Apple e autenticar s gratuitos feitos na Apple Store.

Por conta disso, desenvolvedores já estão trabalhando em programas compatíveis com a tecnologia de reconhecimento facial.

Sabe o aplicativo do banco? Logo mais, poderemos usar só o nosso rosto para fazer transações bancárias.