6

我正在使用 OpenCV 尝试进行一些实时视频处理。由于处理相当繁重,它会显着延迟输出帧,使实时流看起来不连贯。

我想将一些处理卸载到 AsyncTask 中。我已经尝试过了,它实际上使视频更加流畅。但是,它最终会一次启动大量任务,然后它们会慢慢开始返回一些结果。

有什么方法可以减慢速度并等待结果,无论是使用 Synchronize 语句还是其他方法?

在每个相机帧上,我都会开始其中一项任务。DoImgProcessing 进行长处理并返回一个字符串结果。

private class LongOperation extends AsyncTask<Mat, Void, String> {

    @Override
    protected String doInBackground(Mat... params) {
        Mat inputFrame = params[0];
        cropToCenter(inputFrame);
        return doImgProcessing(inputFrame);
    }      

    @Override
    protected void onPostExecute(String result) {
        Log.d(TAG, "on post execute: "+result);

    }

    @Override
    protected void onPreExecute() {
        Log.d(TAG, "on pre execute");
    }
}

public Mat onCameraFrame(Mat inputFrame) {
    inputFrame.copyTo(mRgba);//this will be used for the live stream
    LongOperation op = new LongOperation();
    op.execute(inputFrame);
    return mRgba;
}
4

2 回答 2

3

我会做这样的事情:

// Example value for a timeout.
private static final long TIMEOUT = 1000L;

private BlockingQueue<Mat> frames = new LinkedBlockingQueue<Mat>();

Thread worker = new Thread() {
    @Override
    public void run() {
        while (running) {
            Mat inputFrame = frames.poll(TIMEOUT, TimeUnit.MILLISECONDS);
            if (inputFrame == null) {
                // timeout. Also, with a try {} catch block poll can be interrupted via Thread.interrupt() so not to wait for the timeout.
                continue;
            }
            cropToCenter(inputFrame);
            String result = doImgProcessing(inputFrame);
        }
    }
};
worker.start();

public Mat onCameraFrame(Mat inputFrame) {
    inputFrame.copyTo(mRgba);//this will be used for the live stream
    frames.put(inputFrame);
    return mRgba;
}

onCameraFrame 将帧放在队列中,工作线程从队列中轮询。

这使框架的接收和处理去中心化。您可以使用 来监控队列的增长frames.size()

这是一个典型的生产者-消费者示例。

于 2013-02-19T18:41:00.110 回答
1

如果你在每一帧上都这样做,听起来你需要一个线程。AsyncTask 用于当您想在另一个线程上执行一次性活动时。在这里你想重复做。只需创建一个线程,当它完成一帧时,它会向处理程序发送一条消息,以在 UI 线程上运行 post 步骤。它可以在其循环顶部的信号量上等待下一帧准备好。

于 2013-02-19T17:34:22.593 回答