如何在相机框架中添加图像作为蒙版android opencv

时间:2016-03-02 16:52:20

标签: android opencv android-camera opencv4android

我是opencv for android的新手,并尝试开发一个检测对象的应用程序。我使用opencv sdk 2.4.11中的样本人脸检测。我想在检测到特定徽标后在相机框架中添加图像作为遮罩。在这里我的代码:

public class MainActivity extends Activity implements CvCameraViewListener2, OnTouchListener {
private static final String TAG = "OCVSample::Activity";
private static final Scalar    FACE_RECT_COLOR     = new Scalar(0, 255, 0, 255);

private CameraBridgeViewBase mOpenCvCameraView;
private int mWidth;
private int mHeight;
private int mAbsoluteFaceSize =0;
private CascadeClassifier cascadeClassifier;

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
        case LoaderCallbackInterface.SUCCESS:
        {
            Log.i(TAG, "OpenCV loaded successfully");
            mOpenCvCameraView.enableView();
            mOpenCvCameraView.setOnTouchListener(CameraCalibrationActivity.this);
            InputStream is = getResources().openRawResource(R.raw.cascade_a3_23);
            File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
            File mCascadeFile = new File(cascadeDir, "cascade_a3_23.xml");
            FileOutputStream os = null;
            try {
                os = new FileOutputStream(mCascadeFile);
                 byte[] buffer = new byte[4096];
                    int bytesRead;
                    while ((bytesRead = is.read(buffer)) != -1) {
                        os.write(buffer, 0, bytesRead);
                    }
                    is.close();
                    os.close();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            cascadeClassifier= new CascadeClassifier(mCascadeFile.getAbsolutePath());
        } break;
        default:
        {
            super.onManagerConnected(status);
        } break;
        }
    }
};

public CameraCalibrationActivity() {
    Log.i(TAG, "Instantiated new " + this.getClass());
}

@Override
public void onCreate(Bundle savedInstanceState) {
    Log.i(TAG, "called onCreate");
    super.onCreate(savedInstanceState);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    LinearLayout linearLayout=new LinearLayout(this);
    linearLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

    mOpenCvCameraView = new JavaCameraView(this, CameraBridgeViewBase.CAMERA_ID_BACK);
    mOpenCvCameraView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
    mOpenCvCameraView.setCvCameraViewListener(this);
    linearLayout.addView(mOpenCvCameraView);
    setContentView(linearLayout);
}

@Override
public void onPause()
{
    super.onPause();
    if (mOpenCvCameraView != null)
        mOpenCvCameraView.disableView();
}

@Override
public void onResume()
{
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_11, this, mLoaderCallback);
    super.onResume();
}


public void onCameraViewStarted(int width, int height) {
    if (mWidth != width || mHeight != height) {
        mWidth = width;
        mHeight = height;
    }
}

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {

    Mat mRgba = inputFrame.rgba();
    Mat mGrey = inputFrame.gray();
    MatOfRect faces = new MatOfRect(); 
    int height = mGrey.rows();
    if (Math.round(height * 0.2) > 0) {
        mAbsoluteFaceSize = (int) Math.round(height * 0.2);
    }
    cascadeClassifier.detectMultiScale(mGrey, faces, 1.1, 2, 2, // TODO: objdetect.CV_HAAR_SCALE_IMAGE
            new Size(mAbsoluteFaceSize, mAbsoluteFaceSize), new Size());
    Rect[] facesArray = faces.toArray();
    for (int i = 0; i < facesArray.length; i++)
        Core.rectangle(mRgba, facesArray[i].tl(), facesArray[i].br(), FACE_RECT_COLOR, 3);

    return mRgba;
}

我希望将此图片mask添加到my camera view 任何人都可以帮助我吗?

0 个答案:

没有答案