Fazer um programa para captura de camera

Programação C em geral

Moderadores: 51, guest2003

Fazer um programa para captura de camera

Mensagempor joao » 28 Ago 2008 09:42

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!
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor msamsoniuk » 28 Ago 2008 11:02

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.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor helton » 28 Ago 2008 12:01

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...
Helton Marques
"Priorize as Prioridades"
helton
Byte
 
Mensagens: 146
Registrado em: 16 Out 2006 09:18
Localização: São José-SC

Mensagempor joao » 28 Ago 2008 13:57

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
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor msamsoniuk » 28 Ago 2008 14:31

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! :)
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor joao » 29 Ago 2008 08:50

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
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor msamsoniuk » 29 Ago 2008 13:01

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.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor joao » 06 Set 2008 14:03

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
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21


Voltar para Visual C++/C/C++/C#

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x