When a face is detected, the application crashes. And he doesn’t even get an error, just application terminated.
The inspiration was served by these materials:
https://stackoverflow.com/questions/38749867/mask-not-displayed-in-opencv-camera-preview
http://opencvexamples.blogspot.com/2013/11/putting-mask-on-face-using-opencv.html

I would be grateful for any help!)

public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 { private static final String TAG = "MainActivity"; private JavaCameraView mJavaCameraView; private Mat mRgba; private Mat mask; private CascadeClassifier cascadeClassifier; private int mAbsoluteFaceSize = 0; static { System.loadLibrary("native-lib"); if (OpenCVLoader.initDebug()) { Log.d(TAG, "OpenCV loaded!"); } else { Log.d(TAG, "OpenCV NOT loaded!"); } } BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { @Override public void onManagerConnected(int status) { switch (status) { case BaseLoaderCallback.SUCCESS: { mJavaCameraView.enableView(); InputStream is = getResources().openRawResource(R.raw.haarcascade_frontalface_alt2); File cascadeDir = getDir("cascade", Context.MODE_PRIVATE); File mCascadeFile = new File(cascadeDir, "haarcascade_frontalface_alt2.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; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mJavaCameraView = (JavaCameraView) findViewById(R.id.cameraView); mJavaCameraView.setVisibility(View.VISIBLE); mJavaCameraView.setCvCameraViewListener(this); try { File file = new File(Environment.getExternalStorageDirectory(), "5.jpg"); mask = imread(file.getPath(), -1); } catch (Exception e) { e.printStackTrace(); Log.d(TAG, "File NOT find"); } } @Override protected void onPause() { super.onPause(); if (mJavaCameraView != null) { mJavaCameraView.disableView(); } } @Override protected void onDestroy() { super.onDestroy(); if (mJavaCameraView != null) { mJavaCameraView.disableView(); } } @Override protected void onResume() { super.onResume(); if (OpenCVLoader.initDebug()) { Log.d(TAG, "OpenCV loaded"); mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); } else { Log.d(TAG, "OpenCV NOT loaded!!!"); OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, this, mLoaderCallback); } } @Override public void onCameraViewStarted(int width, int height) { mRgba = new Mat(width, height, CvType.CV_8UC4); } @Override public void onCameraViewStopped() { mRgba.release(); } @Override public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { mRgba = inputFrame.rgba(); MatOfRect faces = new MatOfRect(); cascadeClassifier.detectMultiScale(mRgba, faces, 1.1, 2, 1,//Objdetect.CASCADE_SCALE_IMAGE, new Size(mAbsoluteFaceSize, mAbsoluteFaceSize), new Size()); Rect[] facesArray = faces.toArray(); for (int i = 0; i < facesArray.length; i++) { Point center = new Point(facesArray[i].x + facesArray[i].width / 2, facesArray[i].y + facesArray[i].height / 2); mRgba = putMask(mRgba, center, new Size(facesArray[i].width, facesArray[i].height)); } return mRgba; } private Mat putMask(Mat src, Point center, Size face_size) { Log.d(TAG, "src at the START of putMask(): " + src.toString()); Mat mask_resized = new Mat(); Mat src_roi = new Mat(); Mat roi_gray = new Mat(); resize(mask, mask_resized, face_size); Rect roi = new Rect((int) (center.x - face_size.width / 2), (int) (center.y - face_size.height / 2), (int) face_size.width, (int) face_size.height); src.submat(roi).copyTo(src_roi); Log.d(TAG, "MASK SRC1 :" + src_roi.size()); Mat mask_grey = new Mat(); Mat roi_rgb = new Mat(); cvtColor(mask_resized, mask_grey, COLOR_BGR2GRAY); threshold(mask_grey, mask_grey, 230, 255, THRESH_BINARY_INV); ArrayList<Mat> maskChannels = new ArrayList<>(3); ArrayList<Mat> result_mask = new ArrayList<>(3); result_mask.add(new Mat()); result_mask.add(new Mat()); result_mask.add(new Mat()); split(mask_resized, maskChannels); bitwise_and(maskChannels.get(0), mask_grey, result_mask.get(0)); bitwise_and(maskChannels.get(1), mask_grey, result_mask.get(1)); bitwise_and(maskChannels.get(2), mask_grey, result_mask.get(2)); merge(result_mask, roi_gray); bitwise_not(mask_grey, mask_grey); ArrayList<Mat> srcChannels = new ArrayList<>(3); split(src_roi, srcChannels); bitwise_and(srcChannels.get(0), mask_grey, result_mask.get(0)); bitwise_and(srcChannels.get(1), mask_grey, result_mask.get(1)); bitwise_and(srcChannels.get(2), mask_grey, result_mask.get(2)); merge(result_mask, roi_rgb); addWeighted(roi_gray, 1, roi_rgb, 1, 0, roi_rgb); src = new Mat(src, roi); roi_rgb.copyTo(src); Log.i(TAG, "src at the END of putMask(): " + src.toString()); return src; } 

}

Versions:
OpenCV 3.4.3
NDK 14b

With a simple face detection, without a mask, but simply with a stroke of a small square, it works well.

    0