Capturar imagem da web cam e salvar a cada 1 segundo

7 respostas
imagesprogramaçãojava
J

Olá!
Estou fazendo um projeto em que a webcam padrão tira fotos a cada 1 segundo utilizando o opencv.
Por enquanto ,nesse code, ao clique do botão capturar você seleciona a pasta onde quer e ele captura uma foto. É necessario um loop para fazer isso? E qual a melhor opção para o usuario para ele parar a gravação, um jButton ou um atalho do teclado?

public class jfmPrincipal extends javax.swing.JFrame {
 
    VideoCaptura webCam;
    ExibeQuadro exibeQuadro;
    Thread executor;
  private DaemonThread myThread = null;
    int count = 0;
    VideoCapture webSource = null;
 
    Mat frame = new Mat();
    MatOfByte mem = new MatOfByte();
    
    
    class DaemonThread implements Runnable
    {
    protected volatile boolean runnable = false;
 
    @Override
    public  void run()
    {
        synchronized(this)
        {
            while(runnable)
            {
                if(webSource.grab())
                {
    try
                        {
                            webSource.retrieve(frame);
   Highgui.imencode(".bmp", frame, mem);
   Image im = ImageIO.read(new ByteArrayInputStream(mem.toArray()));
 
   BufferedImage buff = (BufferedImage) im;
   Graphics g=jlbCaptura.getGraphics();
 
   if (g.drawImage(buff, 0, 0, getWidth(), getHeight() -150 , 0, 0, buff.getWidth(), buff.getHeight(), null))
   
   if(runnable == false)
                            {
    System.out.println("Going to wait()");
    this.wait();
   }
}
catch(Exception ex)
                         {
   System.out.println("Error");
                         }
                }
            }
        }
     }
   }
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
     
        int returnVal = jFileChooser1.showSaveDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
        File file = jFileChooser1.getSelectedFile();
        Highgui.imwrite(file.getPath(), frame);
    } else {
        System.out.println("Acesso negado.");
    }
}

7 Respostas

D

Sim, é necessário um loop.
Tanto faz se um atalho ou um botão, depende de como tua aplicação está construída

J

Decidi que vou faze-lo a partir de um jButton, como posso alterar o code?

D

Vai fazer o que a partir do JButton? Interromper o loop ou iniciá-lo?

J

Então, já tenho um jbutton que para a captura, e o jbutton para capturar captura apenas 1 imagem.

D

Você sabe que em qualquer tipo de sistema, quando há necessidade de repetir um determinado trecho de código, você precisará de uma estrutura de repetição, certo?
Também deve saber que existem três tipos de estrutura de repetição: com início e total de iterações definidos (para), com total de iterações indefinido (enquanto) e com total de iterações indefinidos, mas que será executado ao menos uma vez (faça/enquanto).
Portanto, como você repetiria o trecho em que a captura ocorre? Mais do que isso, como vai garantir que o processo seja executado a cada 1 segundo?

J

Na minha proporção, usaria o faça/enquanto pois se encaixa melhor no projeto.
Em relação a outra pergunta, não faço ideia, pois tentei automatizar o AMCap,fazendo que a partir de um clique ele começe a fazer as capturas antes de fazer esse projeto e tambem não deu certo.

D
Basicamente:

`seuJButton.addActionListener(

new ActionListener(ActionEvent e){

capturar();

}

);
protected function capturar(){

//para ou enquanto ou faça/enquanto

//invoca captura

//para a execução por 1 segundo, talvez Thread.sleep(1000);

/fim do laço de repetição

}`
Criado 4 de outubro de 2016
Ultima resposta 4 de out. de 2016
Respostas 7
Participantes 2