Jam*_*meo 6 android image-processing android-asynctask
我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
我会做类似的事情:
// 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;
}
Run Code Online (Sandbox Code Playgroud)
onCameraFrame 将帧放入队列中,工作线程从队列中轮询。
这降低了框架的接收和处理。您可以使用 来监控队列的增长frames.size()。
这是一个典型的生产者-消费者的例子。