Toon posts:

[Java] Trage framegrabber

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb de volgende framegrabber gemaakt om een beeldje van een webcam op te halen m.b.v. Video4Linux (daarbij gebruik makend van JMF):

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// Imports
// ...

public class FrameGrabber {

private FrameGrabbingControl frameGrabber;
private Player player;

    public FrameGrabber() {
        // Create capture device
    CaptureDeviceInfo deviceInfo = CaptureDeviceManager.getDevice("v4l:BT878(Hauppauge (bt878)):0");
    try {
            player = Manager.createRealizedPlayer(deviceInfo.getLocator());
    }
    catch(Exception e) {}
    player.start();

        // Wait a few seconds for camera to initialise (otherwise img==null)
    try {
            Thread.sleep(500);
    }
    catch(Exception e) {}

    // Grab a frame from the capture device
        frameGrabber = (FrameGrabbingControl)player.getControl("javax.media.control.FrameGrabbingControl");
    }

      public BufferedImage grab() {
          Buffer buf = frameGrabber.grabFrame();

       // Convert frame to an buffered image so it can be processed and saved
           Image img = (new BufferToImage((VideoFormat)buf.getFormat()).createImage(buf));
           BufferedImage buffImg = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
          Graphics2D g = buffImg.createGraphics();
          g.drawImage(img, null, null);
          return buffImg;
    }
    
    public void close() {
       // Stop using webcam
          player.close();
          player.deallocate();
    }
}
Nu heb ik de tijd gemeten die het kost om de method grab() uit te voeren, en dat is zo'n 320 ms gemiddeld. Dit betekent dat je zo'n 3 frames per seconde zou kunnen grabben. Ik vind het vreemd dat dit zo lang duurt. Eerst grabte ik namelijk met een tooltje (streamer). Dat liet ik een bestand wegschrijven en dat bestand las ik dan weer in in m'n Java-programma. Allemaal superomslachtig natuurlijk, maar dat ging ongeveer net zo snel :?

Heeft iemand enig idee waarom dat grabben via JMF zo traag gaat?

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 27-05 22:34
Uhm, check eens of img al een instanceof BufferedImage is.

Verder zou je kunnen overwegen de aanmaak van BufferedImage en het opvragen van de Graphics 1x te doen en deze bij grab() steeds weer te gebruiken.

[ Voor 61% gewijzigd door Jelmer op 29-01-2004 16:08 ]


Verwijderd

Topicstarter
Volgens mij niet. Ik kan het nu alleen even niet proberen ;)
Uit de JMF API:
Converts the input buffer to a standard AWT image and returns the image.
Dat tweede is idd wel een idee. Maar gebruikt die method getGraphics() dan zoveel tijd joh :?

[ Voor 71% gewijzigd door Verwijderd op 29-01-2004 16:22 ]


Verwijderd

Java is gewoon SLOOM

Verwijderd

Wat een nuttige reply...


Misschien kun je inderdaad die stap om je orginele image naar een buffered image te kopiëren overslaan, dat zou in ieder geval een paar milliseconden (ik denk ergens tussen de 100 en 200 ms) voor het alloceren van een nieuwe image en het kopieren van het orginele plaatje besparen.

Misschien kun je ook een aantal System.out.prints erin zetten met de timestamp zodat je ziet waar de tijd nou verloren gaat. Als je het plaatje wilt tekenen ofzo zou je ook kunnen kijken of je rechtstreeks met die buffer wat kunt die in plaatst van er een image van te maken.

Hopelijk heb je hier wel wat aan :)

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

waarom doe je het opslaan van het plaatje niet in een aparte Thread?, dan kun je op het moment dat je wacht op de input van de camera. De afbeelding wegschrijven.

Via het procuder / consumer pattern zou dat mooi kunnen (of het echt sneller is moet je even uittesten)
Pagina: 1