异步任务中基于帧的OpenCV Android图像处理

异步任务中基于帧的OpenCV Android图像处理,android,opencv,image-processing,android-asynctask,Android,Opencv,Image Processing,Android Asynctask,晚上, 我试图通过检测场景中的标记来创建一个增强现实应用程序。为了做到这一点,我需要对图像进行大量处理。我在每一帧都使用onCameraFrame()方法,但是图像处理占用了线程,并且相机感觉滞后,fps低。因此,我尝试使用AsyncTask将图像处理部分放到后台。我在CameraCalibrationActivity中找到了一个AsyncTask的示例,通过遵循它,我尝试复制代码,但在启动应用程序后,它崩溃了,错误是0x00000028(代码=1)处的致命信号11(SIGSEGV),线程162

晚上,

我试图通过检测场景中的标记来创建一个增强现实应用程序。为了做到这一点,我需要对图像进行大量处理。我在每一帧都使用onCameraFrame()方法,但是图像处理占用了线程,并且相机感觉滞后,fps低。因此,我尝试使用AsyncTask将图像处理部分放到后台。我在CameraCalibrationActivity中找到了一个AsyncTask的示例,通过遵循它,我尝试复制代码,但在启动应用程序后,它崩溃了,错误是0x00000028(代码=1)处的致命信号11(SIGSEGV),线程16291(AsyncTask#5)。另外,如果我尝试以其他方式实现AsyncTask,应用程序会成功运行,但FPS仍然很低(FPS的增加速度大约为2FPS)。我将发布这两个实现。如果任何人有任何建议,经验-请张贴

类似于CameraCalibrationActivity()中的实现:

public Mat onCameraFrame(CvCameraViewFrame inputFrame)
{
mRgba=inputFrame.rgba();
新建异步任务()
{
@凌驾
受保护的Void doInBackground(Void…arg0)
{
MarkerDetector.detect(mRgba,detectedMarkers,CameraParameters,(浮点)0.14,mRgba);
返回null;
}
}.execute();
返回mRgba;
}
我自己在子类上使用seter方法的实现:

public class MarkerDetector extends AsyncTask<Void, Void, Void>
{
    private Mat inGlobal;
    private Vector<Marker> detectedMarkersGlobal;
    private CameraParameters cameraParametersGlobal;

    public void detect(Mat in, Vector<Marker> detectedMarkers, CameraParameters cp,float markerSizeMeters, Mat frameDebug)
    {
        // image processing code here
    }

    public void setInputFrameMatrix(Mat _in)
    {
        inGlobal = _in;
    }

    public void setDetectedMarkers(Vector<Marker> _detectedMarkers)
    {
        detectedMarkersGlobal = _detectedMarkers;
    }

    public void setCameraParameters(CameraParameters _cameraParameters)
    {
        cameraParametersGlobal = _cameraParameters;
    }

    @Override
    protected Void doInBackground(Void... params) 
    {
        this.detect(inGlobal, detectedMarkersGlobal, cameraParametersGlobal, (float) 0.14, inGlobal);
        return null;
    }
}

public class Tutorial3Activity extends Activity implements
CvCameraViewListener2, OnTouchListener 
{
    public Mat onCameraFrame(CvCameraViewFrame inputFrame) 
    {
        mRgba = inputFrame.rgba();

        MarkerDetector.setCameraParameters(CameraParameters);
        MarkerDetector.setDetectedMarkers(detectedMarkers);
        MarkerDetector.setInputFrameMatrix(mRgba);

        MarkerDetector.execute();

        return mRgba;
    }
}
公共类MarkerDetector扩展异步任务
{
内叶私有垫;
私有向量检测标记全局;
私人摄像师摄像师全球;
公共无效检测(Mat in、向量检测标记、摄影机参数cp、浮点标记器、Mat frameDebug)
{
//这里是图像处理代码
}
公共void setInputFrameMatrix(Mat_in)
{
内叶=_英寸;
}
公共void setDetectedMarkers(向量_detectedMarkers)
{
detectedMarkers全局=_detectedMarkers;
}
公共无效设置CameraParameters(CameraParameters\u CameraParameters)
{
cameraParameters全局=_cameraParameters;
}
@凌驾
受保护的Void doInBackground(Void…参数)
{
此.detect(inGlobal,detectedMarkersGlobal,cameraParametersGlobal,(float)0.14,inGlobal);
返回null;
}
}
公共类教程3活动扩展活动实现
CvCameraViewListener2,OnTouchListener
{
CameraFrame上的公用Mat(CvCameraViewFrame输入框)
{
mRgba=inputFrame.rgba();
MarkerDetector.setCameraParameters(CameraParameters);
MarkerDetector.setDetectedMarkers(detectedMarkers);
MarkerDetector.setInputFrameMatrix(mRgba);
MarkerDetector.execute();
返回mRgba;
}
}

那么,您的每一帧都会产生一个新的异步任务来进行处理?您已经证明,在渲染新帧所需的时间内无法进行处理。。。这意味着,即使你让它工作起来,你最终也会有太多的异步任务运行,导致你崩溃。doInBackground实现崩溃的原因也可能是因为mRgba相当大,你生成了5个,然后是SEGFULT。(这就是为什么AsyncTask#5)因此,AsyncTask的生成应该在其他地方实现,在那里它只创建一次,我应该在每个帧中检查AsyncTask是否正常工作,然后以某种方式再次尝试激活它?对如何进行检查有什么建议吗?我是个新手,你可以这么做。Asynctask有一个status(),您可以检查每个帧以查看任务是否完成。然后你可以开始一项新任务。这意味着您不会在每一帧上都进行处理。
public class MarkerDetector extends AsyncTask<Void, Void, Void>
{
    private Mat inGlobal;
    private Vector<Marker> detectedMarkersGlobal;
    private CameraParameters cameraParametersGlobal;

    public void detect(Mat in, Vector<Marker> detectedMarkers, CameraParameters cp,float markerSizeMeters, Mat frameDebug)
    {
        // image processing code here
    }

    public void setInputFrameMatrix(Mat _in)
    {
        inGlobal = _in;
    }

    public void setDetectedMarkers(Vector<Marker> _detectedMarkers)
    {
        detectedMarkersGlobal = _detectedMarkers;
    }

    public void setCameraParameters(CameraParameters _cameraParameters)
    {
        cameraParametersGlobal = _cameraParameters;
    }

    @Override
    protected Void doInBackground(Void... params) 
    {
        this.detect(inGlobal, detectedMarkersGlobal, cameraParametersGlobal, (float) 0.14, inGlobal);
        return null;
    }
}

public class Tutorial3Activity extends Activity implements
CvCameraViewListener2, OnTouchListener 
{
    public Mat onCameraFrame(CvCameraViewFrame inputFrame) 
    {
        mRgba = inputFrame.rgba();

        MarkerDetector.setCameraParameters(CameraParameters);
        MarkerDetector.setDetectedMarkers(detectedMarkers);
        MarkerDetector.setInputFrameMatrix(mRgba);

        MarkerDetector.execute();

        return mRgba;
    }
}