2017-08-02 1 views
0

にストリーム。クラッシュは、私はアッカ・ストリームを使用しながら、JavaでOpenCVのLIBSにいくつかのビデオ分析を行うアプリケーションを作成したい私のプロジェクトのためのJava

私はAkkaストリームを使用しない別のプロジェクトでBGsubtractorMOG2を使用してみましたが、すべて正常に動作しますが、MOG2関数を含むステージでストリームを生成するとプログラムがクラッシュします。私は問題をMOG2に入れていると確信しています。なぜなら、私はそれを削除しようとするとビデオのフレームをすべてキャプチャして表示するだけです。ここで

は、これは以下に

this.frameSource = Source.fromGraph(new CameraFrameSource(capture)); 
OpenCVのVideoCaptureとフレームを生成アッカ・ストリーム・ソースを作成 事前開始()メソッドで実行されます

private final Materializer materializer = 
ActorMaterializer.create(this.getContext()); 
private final BackgroundSubtractorMOG2 mog2 = Video.createBackgroundSubtractorMOG2(); 

アッカアクタ内のコードの一部であります

これはストリームの途中で、ビデオ分析をしたい部分です。それは1つがビデオ解析を通過、フレームのコピーを作成し、他にはジップにそのまま入るとHOG2によって処理されるために、そのコピーに待機

this.videoAnalysisPartialGraph = GraphDSL.create(builder -> { 
     final UniformFanOutShape<Mat, Mat> A = builder.add(Broadcast.create(2)); 
     final FlowShape<Mat, Mat> bgs = builder.add(Flow.of(Mat.class).map(
     f -> {return subtractBackground(f); }).async()); 
     final FanInShape2<Mat, Mat, Pair<Mat, Mat>> zip = 
      builder.add(ZipWith.create((Mat left, Mat right) -> { 
      return new Pair<Mat, Mat>(left, right); 
     })); 

     builder.from(A).toInlet(zip.in1()); 
     builder.from(A).via(bgs).toInlet(zip.in0()); 

     return new FlowShape<Mat, Pair<Mat, Mat>>(A.in(), zip.out()); 

    }); 

これは、プログラムがクラッシュするときになるサブス法でありますそれは、その後、マテリアこれはアクタが単に第33フレームそれぞれを選ぶメッセージを受信し、マットのペアを作成する段階でそれらを処理後マテリアライズドますデバッグ目的のために作成された閉じたグラフである

private Mat subtractBackground(Mat frame){ 
    Mat fgmask = new Mat(); 
    this.mog2.apply(frame, fgmask); 
    return fgmask; 
} 

の実行を開始しますペアの2つのマットのうちの1つがピックされてウィンドウに表示され、キルスイッチの部分がh ELP私は、それが実際に必要なのかどうかわからない、ストリームをオフにしますが、関与なしMOG2が、これは、ストリームを実行する方法である

this.stream = frameSource.throttle(33, FiniteDuration.create(1, TimeUnit.SECONDS), 1, ThrottleMode.shaping()) 
      .via(this.videoAnalysisPartialGraph).map(p -> p.first()).viaMat(KillSwitches.single(), Keep.right()) 
      .toMat(Sink.foreach(f -> showFrame(f)), Keep.left()); 

が存在しない場合、ストリームが働くので、気にしません

private void startVideoCapture() { 
    this.capture.open(cameraId); 
    if (capture.isOpened()) { 
     this.cameraActive = true; 
     killswitch = this.stream.run(materializer); 

    } else { 
     System.err.println("Can't open camera connection."); 
    } 
} 

私はバックグラウンドの減算をしていないときにストリームが完璧に動作すると言っていたので、キャプチャしたビデオを同じストリームグラフ(もちろんhog2を含まないように変更)で画面に表示します。

それがディスパッチャ/ materializatorとは何かを持っていますか?誰も何の提案もしていませんか?私は、ストリームの外に、まだアッカの俳優、まだプログラムがクラッシュ内MOG2を適用しようとした :

はあなたに

EDITありがとうございます。ですから、Akkaの俳優がMOG2.applyコールをどのように扱うかということに関連していると思います。

答えて

0

回避策

私はOpenCVのLIBSとアッカ・遠隔LIBSの間に矛盾が、私は後者を削除し、すべてが正常に動作する瞬間のために、そこにいたことが判明した後、私は問題を解決しました。 将来両方のlibsを一緒に使う必要があるかもしれませんので、私はまだ完全に解決する方法をまだ分かりません

関連する問題

 関連する問題