2012-10-22 20 views
6

Chcę wyodrębnić klatki z wideo i zastosować do niego filtry takie jak gabor/hough itp. Która biblioteka Java byłaby idealna do obsługi wszelkiego rodzaju kodowania wideo? Patrzyłem na GStreamer, JMF, Xuggler itp., Ale nie jestem w stanie zdecydować, który z nich będzie najlepszy. Chciałbym także edytować klatki i zrobić wideo z nowymi ramkami.Biblioteka przetwarzania wideo dla języka Java

Odpowiedz

8

Jeśli chcesz wykonywać operacje na niskim poziomie, takie jak wyodrębnianie ramek i manipulowanie nimi, to najlepszym wyborem będzie Xuggler, ponieważ interfejsy API są nastawione na tak niski poziom. Działa na ffmpeg, dzięki czemu obsługuje wszystkie rodzaje kodowania wideo.

Nie używaj JMF do niczego, jest stary, przestarzały i wadliwy - GStreamer jest dobry, ale API nadaje się bardziej do odtwarzania filmów niż manipulowania klatkami.

+0

Dzięki! Domyślam się, że to Xuggler. Wygląda również na to, że OpenCV dla Java można ręcznie skonfigurować http://answers.opencv.org/question/2137/wrapping-opencv-with-desktop-java-building-for-64/ - wszelkie pomysły na to, czy byłoby lepiej ? – abhishek

+0

Nie korzystałem z OpenCV, więc nie mogę tego komentować, ale prawdopodobnie pochylę się w kierunku Xugglera, ponieważ jest to czysty interfejs API języka Java, który powinien ułatwić zadanie. – berry120

1

JMF to dobry wybór. Ale jeśli czas procesu jest ważny w twoim kodzie, lepiej użyć Xugglera. Oczywiście JMF jest bardziej ogólny niż Xuggler.

0

Xuggler, tak. Ale jeśli zamierzasz pracować nad wieloma procesami przetwarzania obrazu, powinieneś wybrać z OpenImaj. Ta biblioteka używa Xuggler jako swojej zależności, ale to nie wszystko, co robi. Pomyśl o posiadaniu możliwości Opencv bez braku szybkości, które dostajesz w Javie. Poza tym wszystko, czego wymaga, to dodanie uzależnienia od mavenów i jesteś gotowy. Ilość kodu jest również zmniejszona.

Uwaga: Wciąż przeglądam bibliotekę i będę na bieżąco aktualizować moją odpowiedź na temat tego, jak to działa.

Film wprowadzający: https://www.youtube.com/watch?v=TNEQ0eNqLgA

1

Można spróbować Marvin Framework. Używa JavaCV do kodowania wideo i dostępu do urządzenia, ale wszystkie algorytmy przetwarzania obrazu są czystą Javą.

Ładowanie wideo i przetwarzanie klatek w czasie rzeczywistym jest bardzo łatwe, jak pokazano w poniższym przykładzie wykrywania krawędzi. Kod

enter image description here

Źródło:

import static marvin.MarvinPluginCollection.*; 

public class SimpleVideoProcessing extends JFrame implements Runnable{ 

    private MarvinVideoInterface videoAdapter = new MarvinJavaCVAdapter(); 
    private MarvinImagePanel  videoPanel = new MarvinImagePanel(); 
    private MarvinImage    videoFrame, videoOut = new MarvinImage(640,480); 

    public SimpleVideoProcessing() throws MarvinVideoInterfaceException{ 
     super("Simple Video Processing using Marvin"); 
     add(videoPanel); 
     // Load video file and start the processing thread 
     videoAdapter.loadResource("./res/snooker.wmv"); 
     new Thread(this).start(); 
     setSize(640,500); 
     setVisible(true); 
    } 

    public void run() { 
     try { 
      while(true){ 
       // Request, process and show the video frame. 
       videoOut.clear(); 
       videoFrame = videoAdapter.getFrame(); 
       prewitt(videoFrame.clone(), videoOut); 
       videoPanel.setImage(videoOut); 
      } 
     } catch (MarvinVideoInterfaceException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) throws MarvinVideoInterfaceException { 
     new SimpleVideoProcessing().setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
}