2012-10-22 9 views
6

비디오에서 프레임을 추출하고 gabor/hough 등 일부 필터를 적용하고 싶습니다. 모든 종류의 비디오 인코딩을 처리하는 데 가장 적합한 Java 라이브러리는 무엇입니까? 나는 GStreamer, JMF, Xuggler 등을보고 있었지만 어느 것이 가장 좋을지 결정할 수 없었다. 또한 프레임을 편집하고 새 프레임으로 비디오를 만들려고합니다.Java 용 비디오 처리 라이브러리

답변

8

프레임을 추출하고 조작하는 것과 같은 낮은 수준의 작업을 수행하려는 경우 API가이 낮은 수준을 대상으로하기 때문에 Xuggler가 최상의 선택입니다. 그것은 ffmpeg에서 작동하므로 모든 종류의 비디오 인코딩을 처리 할 수 ​​있습니다.

GMF는 오래되었지만 시대에 뒤떨어지며 버그가 있습니다. JStream은 훌륭하지만 API는 프레임을 조작하기보다는 동영상 재생에 더 적합합니다.

+0

감사합니다! 그때 Xuggler라고 생각합니다. 또한 OpenCV for Java를 수동으로 구성 할 수있는 것처럼 보입니다. http://answers.opencv.org/question/2137/wrapping-opencv-with-desktop-java-building-for-64/ - 이것이 더 나은지에 대한 아이디어 ? – abhishek

+0

나는 OpenCV를 uesd하지 않았기 때문에 주석을 달 수는 없지만 Xuggler는 작업을 더 쉽게 만들어주는 순수한 Java API이기 때문에 여전히 Xuggler에 기대고있다. – berry120

1

JMF는 좋은 선택입니다. 그러나 코드에서 프로세스 시간이 중요한 경우 Xuggler를 사용하는 것이 좋습니다. 분명히 JMF는 Xuggler보다 더 일반적입니다.

0

Xuggler, 예. 그러나 많은 이미지 처리 작업을 수행하려면 OpenImaj으로 가야합니다. 이 라이브러리는 Xuggler를 의존성으로 사용하지만 그게 전부는 아닙니다. Java로 얻을 수있는 속도가 부족하지 않은 Opencv의 기능을 생각해보십시오. 또한 필요한 것은 Maven 종속성을 추가하는 것입니다. 코드의 양도 줄어 듭니다.

참고 : 아직 라이브러리를 검토 중이며 어떻게 진행되는지에 대한 답변을 계속 업데이트 할 예정입니다.

입문 비디오 : https://www.youtube.com/watch?v=TNEQ0eNqLgA

1

당신은 Marvin Framework을 시도 할 수 있습니다. 비디오 인코딩 및 장치 액세스에 JavaCV를 사용하지만 모든 이미지 처리 알고리즘은 순수 Java입니다.

아래 가장자리 감지 예제 에서처럼 비디오를로드하고 실시간으로 프레임을 처리하는 것은 매우 쉽습니다.

enter image description here

소스 코드 :

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); 
    } 
}