首页 文章

使用OpenCV BackgroundSubtractorMOG2和Java中的Akka流实现流实现期间崩溃

提问于
浏览
0

对于我的项目,我想创建一个应用程序,在使用Akka流时使用Java中的OpenCV库进行一些视频分析 .

我尝试在一个不使用Akka流的单独项目中使用BGsubtractorMOG2,一切正常,但现在当我使用包含MOG2功能的舞台实现我的流时,我的程序崩溃了 . 我确信问题出在MOG2中,因为如果我尝试删除它并只是捕获并在视频上显示帧,一切正常 .

这里是akka actor中的一些代码

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

这在preStart()方法中执行,以下创建一个akka流源,使用openCV VideoCapture生成帧

this.frameSource = Source.fromGraph(new CameraFrameSource(capture));

这是我想要完成视频分析的流的中间部分;它创建了一个框架的副本,一个进行了视频分析,另一个未触及到一个zip并等待其副本由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());

    });

这是一种减法方法,它使程序在实现并开始运行时崩溃

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

这是为调试目的而创建的封闭图形,一旦演员收到一条消息,每秒只选取33帧并分阶段处理它们,创建一对Mat,然后选择该对中的两个Mat中的一个并显示在一个窗口,killswitch部分可以帮助我关闭流,不确定它是否真的需要,但不会打扰,因为当没有涉及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) .

它与调度员/物化器有关吗?我不知道,有没有人有任何建议?

谢谢

编辑:我尝试在流外部应用MOG2,但仍然在AKKA演员内部,程序仍然崩溃 . 所以现在我认为这可能与Akka演员如何处理MOG2.apply电话有关 .

1 回答

  • 0

    WORKAROUND

    在我发现OpenCV libs和akka-remote libs之间存在冲突之后我解决了这个问题,目前我删除后者并且一切正常 . 我将来可能需要同时使用这两个库,所以目前我仍然不知道如何完全解决这个问题

相关问题