Applicazione portatile su java per lavorare con web camera


Sarebbe bello se potessi ottenere consigli sul mio problema: sto lavorando con un'applicazione che dovrebbe mostrare all'utente un elenco di telecamere PC collegate. Ad esempio, usando il mio notebook ho una webcam integrata e una fotocamera USB. Quando si esegue l'applicazione, l'utente dovrebbe essere in grado di selezionare il dispositivo desiderato e creare una foto con esso.

Ho lavorato con questo problema per diversi giorni e ho ricercato utilizzando i seguenti framework esistenti: JMF, FMJ, VLCJ, Xuggler, JMyron, JavaFX, JavaCV.

Alcuni di essi sono stati deprecati; altri richiedono l'installazione dell'SDK per ogni PC client. Il requisito principale della mia applicazione è la portabilità, tuttavia, e questo mi fa indossare l'uso di SDK esterni.

È possibile completare questa attività utilizzando solo Java?

In questo momento la mia applicazione dovrebbe funzionare solo su sistema operativo Windows.

Quindi, potrei avere qualche consiglio su come risolvere il mio problema?

Saluti, Evgeniy

Author: alvonellos, 2012-09-16

1 answers

Mi dispiace di aver postato la domanda così presto. Ho appena risolto questo problema. Ho usato LTI-CIVIL. Non è stato aggiornato per 5 anni... Ad ogni modo, funziona bene per tutti i miei webcam. Ho cambiato un po ' uno degli esempi di utilizzo per passare da dispositivi esistenti. Ecco il mio codice:

    public class CaptureFrame extends ImageFrame
{
private Map <String, String>cams = new HashMap<String, String>();
public static void main(String[] args) throws CaptureException
{
    new CaptureFrame(DefaultCaptureSystemFactorySingleton.instance()).run();
}

private CaptureSystem system;
private CaptureStream captureStream;
private final CaptureSystemFactory factory;
private volatile boolean disposing = false;

public CaptureFrame(CaptureSystemFactory factory)
{   
    super("LTI-CIVIL");
    this.factory = factory;
}

public void run() throws CaptureException
{
    initCapture();

    setLocation(200, 200);
    addWindowListener(new WindowAdapter()
    {
        public void windowClosing(WindowEvent e)
        {
            try
            {
                disposeCapture();
            } catch (CaptureException e1)
            {
                e1.printStackTrace();
            }
            System.exit(0);
        }
    });
    setVisible(true);
    pack();

    system = factory.createCaptureSystem();
    system.init();
    List <CaptureDeviceInfo>list = system.getCaptureDeviceInfoList();
    String[] possibilities = new String[list.size()];
    int i=0;
    for (CaptureDeviceInfo info : list){
        possibilities[i] = info.getDescription();
        cams.put(info.getDescription(), info.getDeviceID());
        i++;
    }
    String s = (String) JOptionPane.showInputDialog(
            this,
            "Please, choose needed web camera:\n",
            "Select one...",
            JOptionPane.PLAIN_MESSAGE,
            null,
            possibilities, null);
    captureStream = system.openCaptureDeviceStream(cams.get(s));
    captureStream.setObserver(new MyCaptureObserver());
    setSize(captureStream.getVideoFormat().getWidth(), captureStream.getVideoFormat().getHeight());
    startCapture();
}



public void initCapture() throws CaptureException
{
    system = factory.createCaptureSystem();
    system.init();
}

public void startCapture() throws CaptureException
{
    captureStream.start();
}

public void disposeCapture() throws CaptureException
{
    disposing = true;
    if (captureStream != null)
    {   System.out.println("disposeCapture: stopping capture stream...");
        captureStream.stop();
        System.out.println("disposeCapture: stopped capture stream.");
        captureStream.dispose();
        captureStream = null;
    }
    if (system != null)
        system.dispose();
    System.out.println("disposeCapture done.");
}

class MyCaptureObserver implements CaptureObserver
{
    public void onError(CaptureStream sender, CaptureException e)
    {   
        e.printStackTrace();
    }

    public void onNewImage(CaptureStream sender, com.lti.civil.Image image)
    {   
        if (disposing)
            return;
        try
        {
            setImage(AWTImageConverter.toBufferedImage(image));
        }
        catch (Throwable t)
        {   t.printStackTrace();
        }
    }
}
}

Anche la dimensione del mio progetto è solo di circa 3 MB con all .librerie dll per sistema operativo Windows

Spero che possa aiutare qualcuno.

Saluti, Evgeniy

 0
Author: evgeniy44, 2012-09-16 21:33:47