Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

let's say, you've got a mask image of the same type and size of your image, a white square in a black image, applying this works basically like this:

    mRgba = inputFrame.rgba();
    if (mask != null) {
        Core.bitwise_and(mRgba, mask, mRgba);
    }

if you had a Rect called sel, making the mask is not difficult either:

mask = Mat.zeros(mRgba.size(), mRgba.type()); // all black:
mask.submat(sel).setTo(Scalar.all(255));   // white square

now you need to make your Activity implement onTouchListener, and implement onTouch, 1st press should be tl corner of the rect, 2nd press br corner. all in all, we've got this:

package com.berak.cam3;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;

import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.app.Activity;

public class CamMaskActivity extends Activity implements CvCameraViewListener2, OnTouchListener {
    CameraBridgeViewBase mOpenCvCameraView;
    Rect sel = new Rect();
    Mat mRgba, mask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cam3);
        mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.cam3_surface_view);
        mOpenCvCameraView.setCvCameraViewListener(this);
        mOpenCvCameraView.setOnTouchListener(this);
    }

    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
            case LoaderCallbackInterface.SUCCESS:
                mOpenCvCameraView.enableView();
                break;
            default:
                super.onManagerConnected(status);
                break;
            }
        }
    };

    @Override
    public void onResume() {;
        super.onResume();
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_5,this, mLoaderCallback);
    }
    @Override
    public void onPause() {
        super.onPause();
        if (mOpenCvCameraView != null)
            mOpenCvCameraView.disableView();
    }
    @Override
    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
        mRgba = inputFrame.rgba();
        if (mask != null) {
            Core.bitwise_and(mRgba, mask, mRgba);
        }
        return mRgba;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void onCameraViewStarted(int width, int height) {
    }

    @Override
    public void onCameraViewStopped() {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int cols = mRgba.cols();
        int rows = mRgba.rows();

        int xOffset = (mOpenCvCameraView.getWidth() - cols) / 2;
        int yOffset = (mOpenCvCameraView.getHeight() - rows) / 2;

        int x = (int)event.getX() - xOffset;
        int y = (int)event.getY() - yOffset;
        if (x<0||y<0||x>=cols||y>=cols) return false;
        if ((sel.x==0 && sel.y==0) || (sel.width!=0 && sel.height!=0))
        {
            mask = null;
            sel.x=x; sel.y=y;
            sel.width = sel.height = 0;
        } else {
            sel.width = x - sel.x;
            sel.height = y - sel.y;
            if ( sel.width <= 0 || sel.height <= 0 ) { // invalid, clear it all
                sel.x=sel.y=sel.width=sel.height = 0;
                mask = null;
                return false;
            }
            mask = Mat.zeros(mRgba.size(), mRgba.type());
            mask.submat(sel).setTo(Scalar.all(255));
        }
        Log.w("touch",sel.toString());
        return false;
    }
}