ビデオからフレームを抽出し、gabor/hough などのフィルタを適用したいのですが、あらゆる種類のビデオ エンコーディングを処理するのに最適な Java ライブラリはどれですか? GStreamer、JMF、Xuggler などを見てきましたが、どれが最適かを判断できません。また、フレームを編集して、新しいフレームでビデオを作成することも検討しています。
4 に答える
フレームの抽出や操作などの低レベルの操作を行う場合は、API がこの低レベルに合わせて調整されているため、Xuggler が最適です。ffmpeg で動作するため、あらゆる種類のビデオ エンコーディングを処理できます。
JMF は何にも使用しないでください。古くて時代遅れでバグがあります。GStreamer は優れていますが、API はフレームの操作よりもビデオの再生に適しています。
Marvin Frameworkを試すことができます。ビデオ エンコーディングとデバイス アクセスに JavaCV を使用しますが、すべての画像処理アルゴリズムはピュア Java です。
以下のエッジ検出の例に示すように、ビデオを読み込んでフレームをリアルタイムで処理するのは非常に簡単です。
ソースコード:
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);
}
}
JMF は良い選択です。ただし、コードで処理時間が重要な場合は、Xuggler を使用することをお勧めします。明らかに、JMF は Xuggler よりも一般的です。
Xuggler はい。ただし、多くの画像処理を行う場合は、OpenImajを使用する必要があります。このライブラリは依存関係として Xuggler を使用しますが、それだけではありません。Java で得られる速度の不足なしに Opencv の機能を持つことを考えてみてください。また、必要なのはmaven依存関係を追加することだけで、準備は完了です。コード量も減ります。
注:私はまだライブラリを見直しており、これがどうなるかについての回答を更新し続けます。