Reconhecimento de padrões de imagem

23 respostas
deniswsrosa

Olá galera!!

Bom, tenho de desenvolver um software de reconhecimento de padrões de imagem, e lógicamente como ja trabalho com java a algum tempo, tenho preferencia por desenvolver usando essa linguagem, porém não tenho me sentindo muito confortável com a maturidade do Java para esse tipo de aplicação, tendo que talvez, recorrer a utilizar linguagem C, oq vcs me dizem sobre o assunto?? conhecem algum framework maturo e razoavelmente bem documentando para esse problema???

23 Respostas

esb

E ai Denis,

Tudo bem?
Eu não conheço nenhum framework que faça isso, talvez alguém aqui conheça. Mas você pode resolver esse problema usando Redes Neurais. O algoritmo Perceptron já consegue resolver problemas simples de reconhecimento de padrões de imagem.

Abraço!
Eduardo

victorwss

Tanto Java quanto C podem fazer o serviço bem, desde que você saiba lidar com a API.

Provavelmente se a aplicação for em C ela rodará mais rápido. Mas, até você ter alguma coisa que possa enfim ser rodada vai demorar mais.

A menos que um desempenho extremo seja um dos seus requisitos, eu recomendaria você usar java. É mais produtivo e tem menor possibilidade de bugs.

esb

victorwss:
Tanto Java quanto C podem fazer o serviço bem, desde que você saiba lidar com a API.

Provavelmente se a aplicação for em C ela rodará mais rápido. Mas, até você ter alguma coisa que possa enfim ser rodada vai demorar mais.

A menos que um desempenho extremo seja um dos seus requisitos, eu recomendaria você usar java. É mais produtivo e tem menor possibilidade de bugs.

No caso, Java eh mais produtivo pra ele porque ele ja trabalha ha algum tempo com a linguagem, como ele mesmo disse. Mas ele pode ter conhecimento em C tambem, ja que ele nao citou. De qualquer forma, no que toca a ter menor possibilidade de bugs, nao tem nada a ver…

luistiagos

Meu amigo sinto lhe dizer q se vc tenque desenvolver algo assim vc ta f**** isso e coisa do cão

T

Por que é coisa diabólica?
Toda vez que você está sendo multado na estrada por excesso de velocidade um sistema está lendo as placas do seu carro - é mais complicado que um simples OCR, porque é necessário achar a placa na imagem do carro, para começar.
Mas não é nada infernal; é só conhecer a bibliografia e perguntar as coisas direitinho ao seu professor, que deve lhe orientar por onde começar. Para que servem os professores, hein?

luistiagos

o que ainda esta palhaçada q java é mais lento q C ? meu amigo acho q vc esta meio desatualizado… antigamente java era bem mais lento… hj em dia com o java 6 ele ate pode superar em alguns pontos o C por exemplo pra vc alocar memoria com o C utilizando malloc é bem mais lento que utilizando o new do java… realmente varia muito da implementação do algoritimo para tal procedimento… mas realmente hj em dia a VM esta muito bem atualizada em questão de performace… e em muitos pontos java supera C em velocidade…

luistiagos

Por que é coisa diabólica?
Toda vez que você está sendo multado na estrada por excesso de velocidade um sistema está lendo as placas do seu carro

vc acabou de responder sua propria pergunta… graças a isto o governo enriquesse com multas…

Para que servem os professores, hein?

Boa pergunta… pelomenos os meus eu nem sei pra que servem pq nunca ajudam em nada…
por isto estou pensando ate em me transferir pra outra facul onde tenha professores que sirvam pra algo…
e olha que e uma facul particular e cara ainda por cima (deve ser justo por isto que eles nao servem pra nada…)

T

Mas para reconhecimento de imagens você precisa de alguns algoritmos que mesmo as versões mais novas da JVM normalmente não conseguem otimizar bem, tanto é que a parte de processamento de imagens (JAI etc.) do Java são todas em código nativo (C++ misturado com um monte de rotinas em Assembly e usando algumas instruções SSE/SSE2/SSE3.)
Se você simplesmente quer implementar algumas coisas para fins acadêmicos, pode usar o Java mesmo.
Senão, eu aconselharia a comprar um pacotão que faz o que você quer, já que as otimizações do compiladores C++ muitas vezes não são suficientes e algum código Assembly escrito por especialistas é necessário.

luistiagos

pra que um codigo assembly escrito por especialistas???
faça vc mesmo…

http://www.temporeal.com.br/produtos.php?id=168702

deniswsrosa

EU estive estudando JAI thingol, mas achei muito precário o material na web sobre ele, na Amazon mesmo, só existe 1 livro q comenta sobre. A vantagem de entrar nessa é a de gerar conhecimento, mas vc acha thingol q a api está matura para fazer algumas coisas mais básicas, como reconhecer movimentos e coisas do tipo?

T

A JAI não serve para fazer reconhecimento de imagens, só processamento (como se fosse um filtro dos mais simples do Photoshop). Para fazer reconhecimento você precisa:

  • Pesquisar mais
  • Não se limitar a Java.
Proteu_Alcebidiano

Denis,

Sobre o JAI, se lhe ajudar como informação, usei-o em 2004 para um player de sequencias de imagens e a troca das imagens não gerava atrasos nem “piscadas” na tela.

Pelo menos quando eu usei, ela foi uma API bastante responsiva para o que eu queria (trocar imagens para simular video).

T+

deniswsrosa

Grato Proteu Alcebidiano

thingol

Estudar mais commm certeza, só estou perguntando mais pra ter um rumo de quais ferramentas devo estudar, isso sem contar patterns etc.

Na verdade o q pensei fazer desde o inicio é o grosso em java e o restante em C, que é de fato o q acho q vou acabar fazendo.

ps: Não quero nem ver a dor de cabeça q isso vai me dar…

esb

Um pouco de teoria (e prática também) de assuntos relacionados:

Reconhecimento de padrões
http://www.ppgia.pucpr.br/~soares/recpad2.html

Reconhecimento de faces humanas usando redes neurais MLP
http://www.teses.usp.br/teses/disponiveis/18/18133/tde-27042006-231620/

Eu tinha implementado alguns algoritmos em LISP para identificação de caracteres… mas nem sei onde foram parar agora :frowning:

paulovittor23

Na época que eu fazia iniciação científica utilizei MatLab…
mas é uma linguagem mais acadêmica…

victorwss

Isso já está offtopic, mas aí vai:

Imagine que você dereferencie um ponteiro nulo. Em java o resultado é “java.lang.NullPointerException” e em C o resultado é “Este programa executou uma operação ilegal e será fechado”.

Imagine que você ultrapasse o limite de um array. Em java o resultado é “java.lang.ArrayIndexOutOfBoundsException” e em C o resultado é corrupção de memória ou obtenção de lixo que ocasionam problemas que podem ser dificílimos de debugar.

Sem falar na sintaxe horrorosa do C (que o java herdou parte dela, mas felizmente no java ficou algo muito mais limpo).

Java é rápido (há dez anos atrás (Java 1.0 e 1.1) era uma carroça puxada por tartarugas, mas hoje 6.0 é muito rápido).
Acontece que C ainda é mais rápido, pois ele nunca verifica se o ponteiro é nulo ou se ele corresponde a um endereço inválido, característica que não há como evitar no java.

Quanto ao malloc vs. new, isso ocorre porque a JVM já pré-aloca a memória para ela e a recicla quando necessário. É possível (porém muito-muito-muito trabalhoso) fazer isso em C. Mas se for feito em C corretamente, o resultado é bem superior ao java.

Na minha opinião, MatLab sim é lento.

esb

victorwss:
Isso já está offtopic, mas aí vai:

Imagine que você dereferencie um ponteiro nulo. Em java o resultado é “java.lang.NullPointerException” e em C o resultado é “Este programa executou uma operação ilegal e será fechado”.

Imagine que você ultrapasse o limite de um array. Em java o resultado é “java.lang.ArrayIndexOutOfBoundsException” e em C o resultado é corrupção de memória ou obtenção de lixo que ocasionam problemas que podem ser dificílimos de debugar.

Respondendo ao Off-topic:

Nenhum dos argumentos apresentados serve para a sua afirmação “Java tem menor possibilidade de bugs”. Quem faz o bug é o desenvolvedor, não é a linguagem. Um desenvolvedor mal preparado pode fazer tanta besteira em Java quanto em C.

luistiagos

esb:
Um desenvolvedor mal preparado pode fazer tanta besteira em Java quanto em C.

tenha certeza que ele vai fazer muito mais estragos no C…

victorwss:
Acontece que C ainda é mais rápido, pois ele nunca verifica se o ponteiro é nulo ou se ele corresponde a um endereço inválido, característica que não há como evitar no java.
Quanto ao malloc vs. new, isso ocorre porque a JVM já pré-aloca a memória para ela e a recicla quando necessário. É possível (porém muito-muito-muito trabalhoso) fazer isso em C. Mas se for feito em C corretamente, o resultado é bem superior ao java.

Bem se for pra pensar seguindo esta base de raciocinio:
pra que usar C? usa direto assembly ou melhor pq não programar usando binario direto? pois assim tera performace total…

deniswsrosa

material muito bom esb muito obrigado cara!

victorwss

Existe gente que programa direto no assembly. Mais ainda, existem casos onde se cria hardware específico para efetuar a tarefa. Quanto mais baixo o nível, melhor fica a possibilidade de otimização, porém pior fica a portabilidade e a complexidade.

luistiagos

não so a portabilidade como tambem a complexidade de manutenção e expansão do software devido a que qto menor e o nivel da linguagem mais complexo fica para um “humano” programar…

F

Dá uma olhada no meu trabalho…

Esta bem teórico mas, acho que pode te ajudar… só não esqueça das referências!

http://bibdig.faj.br/document/?code=65

T

Um colega me passou este ponteiro.

Criado 7 de fevereiro de 2008
Ultima resposta 12 de ago. de 2008
Respostas 23
Participantes 8