Ask Your Question

Pedalas's profile - activity

2015-02-24 21:30:53 -0500 asked a question Image processing in AsyncTask

Evening,

I`m trying to create an Augmented Reality application by detecting markers in a scene. In order to do that, I need to do heavy processing on an image. I do that in onCameraFrame() method at every frame, but the image processing holds up the thread and camera feels laggy with low fps. So I try to put image processing part to the background by using AsyncTask. I have found an example of AsyncTask in CameraCalibrationActivity and by following it I try to replicate the code, but after launching the application it crashes and the error is Fatal signal 11 (SIGSEGV) at 0x00000028 (code=1), thread 16291 (AsyncTask #5). Also, if I try to implement AsyncTask in other way, the app is ran successfully, but the FPS is still low (the FPS increase is like 2 FPS). I will post both of the implementations. If anyone has any suggestions, experiences - please post.

Implementation like in CameraCalibrationActivity():

public Mat onCameraFrame(CvCameraViewFrame inputFrame) 
{
    mRgba = inputFrame.rgba();

    new AsyncTask<Void, Void, Void>() 
    {
        @Override
        protected Void doInBackground(Void... arg0) {
            MarkerDetector.detect(mRgba, detectedMarkers, CameraParameters, (float) 0.14, mRgba);
            return null;
        }
    }.execute();

    return mRgba;
}

My own implementation with seter methods on child class:

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;
    }
}