Página 1 de 1

Fazer um programa para captura de camera

MensagemEnviado: 28 Ago 2008 09:42
por joao
Ola pessoal,

Eu to precisando fazer algo relativamente simples, mas não acho em lugar nenhum explicação sobre isso! (devo estar procurando errado)

O que eu preciso é que o meu software consiga mostrar as imagens da WebCam e dai quando clicar em um botão, que a mesma salve essa imagem (que pode ser qualquer extensão: BMP, JPG, PNG ).

Como fazer isso em Windows e em Linux? Eu sei que serão códigos separados, mas como estou usando o Wxwidgets para poder portar os frames, eu preciso apenas entender como funciona a webcam tanto no windows como linux para poder dai criar uns defines e assim usar o "mesmo" código em ambos.

Qualquer dica será bem vinda.

Obrigado a todos!

MensagemEnviado: 28 Ago 2008 11:02
por msamsoniuk
no linux vc pode usar a api video4linux para interfacear a camera, depois vc tem duas opcoes: descarregar em um multi-buffer na memoria e copiar para a janela periodicamente por software ou usar a extensao Xvideo para que o proprio X faca overlay do video diretamente em uma janela do X por hardware. a segunda opcao permite operar em realtime, mas soh funciona com placas cujo hardware eh preparado para operar com overlay, tanto a digitalizadora quanto a placa de video.

MensagemEnviado: 28 Ago 2008 12:01
por helton
No windows, basicamente ( como tudo no windows ) , uma DLL resolve...msdn tem muita informação sobre isso...infelizmente não tenho aqui o nome da DLL específica para câmeras USB...

MensagemEnviado: 28 Ago 2008 13:57
por joao
Valeu pelas respostas,

Mas é claro que isso gerou mais duvidas!
:)

Primeiro a do Linux:
Como eu posso ver mais sobre a primeira opção, que pelo o que eu entendi, vou ter uma memoria compartilhada entre o video4linux e o meu software. certo? Os programas que existem para linux usam essa primeira opção? Realmente eu não sei nada sobre isso no linux, pois nunca tive curiosidade de aprender, mas agora estou precisando dessas informações, então se vc puder dar mais detalhes agradeço bastante!

A segunda é para o Windows:
Ainda não tive tempo de ver o MSDN, mas será que vc poderia só dar uma explicada geral de como funciona essas Dlls? Eu receberia o que usando os métodos dessas DLLS? Um buffer de video? Um frame? Se for isso, o que eu devo fazer depois de receber isso? Existe bibliotecas em C puro(Nao VisualC++ nem C++BUilder) que peguem os valores recebidos pela DLL e o mostrem na tela?

Obrigado aos dois pelo help, por enquanto estou ainda apenas na parte de avaliação, então não precisa ser nada específico, apenas quero entender mais sobre o assunto.

Obrigado,
Joao

MensagemEnviado: 28 Ago 2008 14:31
por msamsoniuk
tem uns exemplos meus... sao meio antigos, mas dah para ter uma ideia. a primeira implementacao eh de um client X que usa video4linux diretamente:

http://xstep.sourceforge.net/xstep-4.1/ ... /xsteptv.c

ele recebe o video frame a frame e copia a imagem para uma janela do X. em versoes anteriores deste codigo eu jah cheguei a encodificar video em varios formatos, em principio eh o melhor para vc ter acesso completo ao stream de video e manipular ele.

o proximo codigo, no entanto, eh de um client X que usa Xvideo:

http://xstep.sourceforge.net/xstep-4.1/ ... tepvideo.c

neste caso o X server fala direto com a API video4linux e ele nao faz muita coisa, a vantagem eh que tambem nao consome processador, visto que apenas direciona um stream de video para a placa de video diretamente via dma.

embora gaste mais cpu e de mais trabalho, eu recomendaria o primeiro caso, pq a Xvideo esta mal implementada no X server distribuido com o linux e acho que jamais sera consertada! soh q meu exemplo eh para uma versao antiga da video4linux, vc precisaria atualizar! :)

MensagemEnviado: 29 Ago 2008 08:50
por joao
Ola Marcelo,

E se por acaso eu quiser implementar um botão de ZOOM?
Teria que pegar o frame e dai aplicar algum método de manipulação de imagem?

Obrigado,
Joao

MensagemEnviado: 29 Ago 2008 13:01
por msamsoniuk
joao escreveu:Ola Marcelo,

E se por acaso eu quiser implementar um botão de ZOOM?
Teria que pegar o frame e dai aplicar algum método de manipulação de imagem?

Obrigado,
Joao


pois eh, recai na decisao de usar Xvideo ou video4linux.

o Xvideo em principio direciona o stream direto para uma janela jah fazendo adaptacao de profundidade de cor e tamanho. se vc desenha duas janelas, uma dentro da outra, vc pode ter um tamanho externo da janela e um interno. aumentando o tamanho interno vc faz zoom para qualquer tamanho e o Xvideo rescala o stream de video para vc.

porem, quando vc quiser pegar um frame para gravar em jpeg, provavelmente vai ter encontrar uma falha de implementacao no Xvideo usado no linux, que bloqueia a captura do frame. uma ideia de contornar isso seria capturar direto da janela, mas eu notei que em algumas placas de video tudo que vc obtem eh um quadrado azul, pois o mecanismo de overlay nessas placas eh implementado por um chromakey.

assim, fica a solucao mais complexa via video4linux: nesse caso vc a digitalizadora descarrega em buffers de tamanho sempre fixo e profundidade de bits fixa. vc entao copia deste buffer para o X adaptando a profundidade de bits de cor e o tamanho.

a adaptacao de profundidade de bits vai depender do que vc pretende suportar: existem placas graficas que rodam o X com 1 a 24 bits de cor e vc precisaria criar algoritmos para cada um deles, o que eh bastante trabalhoso! e para cada rotina, vc pode incluir tambem o zoom com suporte a interpolacao linear, o que dah uma complicada extra hehehe

bom, existe uma extensao para manipulacao de imagens no X chamada XIE, mas tal como o Xvideo, ela nao eh mais mantida e o know how de como trabalhar com ela praticamente se perdeu no limbo!

na falta de opcoes, eu criei algumas rotinas que convertem buffers de 24 bits para buffers de imagem do X com suporte a algumas combinacoes:

http://xstep.sourceforge.net/xstep-4.1/lib/image.c

a funcao XSImage2Pixmap() converte imagens de 32, 24 e 8 bits em organizacao RGB, BGR e monocromatico para bitmaps do X com formatos de nao compactados de 8, 16 e 32 bits, baseado na paleta de cor corrente, o que significa que deve suportar algo entre 1 e 24 bits de cor, mas sem suporte a tecnica de difusao por erro. essa funcao tambem jah faz o rescalonamento da imagem tanto na vertical quanto horizontal, mas os pixels gerados nao usam valores interpolados.

a funcao XSImage2PixmapAA() eh uma versao de testes que gera pixels extras no zoom atraves de interpolacao em duas direcoes. como eh uma versao de testes, eu implementei apenas para o formato de 16 bits (que inclui displays de 9 a 16 bits).

meio complicadinho neh ?

talvez no gtk ou qt tenha algum recurso melhor em relacao ao X padrao para manipular essas imagens. o fato eh que os recursos supostamente criados para isso (Xvideo e XIE) nao sao mantidos mais pelos desenvolvedores.

MensagemEnviado: 06 Set 2008 14:03
por joao
Valeu Marcelo,

Pelo visto é bem complicado mesmo.
Estive vendo sobre o assunto e realmente é complicado.
Vou começar implementando apenas no windows e assim que acabar para o windows, vou ver o que dá para fazer com o linux.
Como eu preciso capturar as imagens, quem sabe eu deixe estatico dai. Apenas abra as imagens como figuras e pronto.
:D

Mas valeu pela dica!

[]'s