Reconhecimento visual no iPhone
Neste post vamos mostrar os avanços que fizemos com o reconhecimento visual no iPhone.
No primeiro video será mostrado o reconhecimento de produtos (no caso uma copia de um quadro de Romero Britto e uma caixa de Cremogema).
Para aqueles que têm curiosidade sobre o assunto, segue uma explicação básica sem envolver a matemática no post.
Qual é o principio?
Neste caso foi utilizado um Histograma (http://en.wikipedia.org/wiki/Histogram), que serve para representar várias coisas, que em nosso caso, é utilizado para representar a distribuição de cores de um pattern a ser encontrado. Ele é quem coleta os dados em set predefinidos. Eles podem ser usados para calcular magnitude de gradientes, direções, cores ou qualquer outra característica. O resultado final é uma figura estatística de uma representação de dados. Basicamente eles são uma maneira prática de representar o que quer que seja interessante que você aprendeu de uma imagem.
Digamos que estamos pegando a “soma” das cores e esse somatório é usado para fazer uma comparação com uma base e caso ele encontre um valor coerente, ele “reconhece” o objeto. Esse método ajuda no caso dos iPhones 3G que não possuem o ajuste de foco do 3GS e a somatória das cores é mais interessante, por que os valores serão próximos. A depender de como se comparem os histogramas ele também diminui o erro pela distância. Caso a imagem que está sendo capturada esteja ao dobro da distância da que foi usada para gerar a base, o resultado do histograma, ainda assim será proporcional ao histograma original nas distancias (tipo 50% do original).
Usar histogramas é bom para solucionar pequenos problemas de ruído e falta de foco, mas ele é muito sensível a variações de luz (no caso de ambientes externos, de dia, de noite, tempo chuvoso, etc…), que podem representar um somatório de cores totalmente diferente. Em processamento de imagens, cada caso é um caso diferente e temos de pensar na melhor maneira de atender o cliente sem que o resultado fique lento demais. É necessário analisar se o ambiente será controlado ou não.
Já o segundo vídeo usa outra técnica totalmente diferente, foi a mesma que usamos para o teste de detectar rostos (que todo mundo que já usou OpenCV, conhece o Haar Training), entretanto era necessário criar um novo training para esses 3 exemplos. Isso significa criar um set de imagens positivas (o que você quer reconhecer) e um set de imagens negativas (aquilo que você não quer reconhecer) e gerar um novo training que será usado como base para o reconhecimento. No caso o ambiente do reconhecimento é mais “controlado” não sendo necessário gerar milhares de imagens positivas e negativas. No nosso exemplo foram apenas algumas dezenas e já estava funcionando. A vantagem de se usar esse método (entenda melhor aqui: http://en.wikipedia.org/wiki/Viola-Jones_object_detection_framework) é que ele é mais leve para ser calculado.
Existem várias maneiras de se fazer o reconhecimento e ainda estaremos testando outras maneiras.
Posts relacionados:
Os algoritmos de reconhecimento que vcs usam sem bem legais, o resultado tb ta ficando, parabéns!
Só uma dúvida.. como vcs conseguem pegar o vídeo no iPhone em tempo real e processa-lo? Tem alguma API da Apple pra isso? Ou vcs usam jailbreak ou algo não documentado? Pergunto isso pq nunca vi apps que processam de imagens como os seus na App Store..
abraços.
Olá João, estamos usando o PLCamera, que é privado.
Não é necessário jailbreak para utilizá-lo.
Recentemente a Apple passou a analisar estáticamente os binários que estão sendo submetidos e provavelmente, uma aplicação que leia o rawdata da câmera será negada pela AppStore.
Entretanto existem algumas Apps que fazem isso na AppStore (ShopSavvy por exemplo), mas eles foram aprovados antes da Apple começar a checar as chamadas a Apis privadas.
Nossa ideia ainda é viável com fotos (tira-se uma foto e processa a imagem), apesar de que acreditamos que assim como o overlay da camera de video foi liberado, com o tempo a Apple provavelmente irá liberar esse acesso ao rawdata também.
Mas você consegue acessar o rawdata desse PLCamera no iPhone OS 3.0? Tinha achado na internet um meio de fazer isso mas só em versões anteriores..
abraços e obrigado pela resposta!
Olá João, no 3.0 a Apple matou o _camera do PLCameraController matando a maneira que se capturava o rawdata no 2.2.1 e o hack do SurfaceBuffer junto.
Para o 3G já existe uma maneira de fazer isso (que foi o que acabamos usando para os testes), só no 3GS que ainda não dscobrimos como acessar o rawdata, para 3GS a solução no momento é um timer que é disparado e retorna o que se encontra na tela em si. Só que todos os overlays da camera estão vindo junto (até mesmo o quadrado do auto-focus), o que está atrapalhando muito, já que os resultados de testes com imagens estáticas no 3GS representaram um ganho de 70% em relação ao 3G.
Provavelmente a principio iremos usar o caminho “oficial” que é tirando uma foto e processando a imagem, até a Apple melhorar as coisas pra gente.