Распознавание лиц в Android с использованием ML KIT - PullRequest
0 голосов
/ 30 апреля 2020

Я хочу обнаружить лица по потоковому видео с тепловой камеры. Поставщик тепловой камеры предоставляет мне исходный код, используемый для подключения к камере и для потоковой передачи видео с нее.

каждый раз, когда видеоданные изменяются на камере, выполняется функция обратного вызова. Итак, что я сделал, чтобы определять лица каждый раз, когда вызывается функция обратного вызова:

1 - получить текущее растровое изображение из GLView (который расширяет GLSurfaceView).

2 - передать растровое изображение в AsyncTask для обработки с библиотекой видения ML kit.

3 - когда библиотека обнаружит лицо, растровое изображение будет сохранено в хранилище.

ниже приведен исходный код, который я использую:


private void setCallback() {
        LiveAboutImplement.getInstance().setmCallback(new LiveAboutInterface() {

            @Override
            public void getVideoDataCallback(String did, byte[] h264, int type,
                                             int size, int onlinenum, int timesec, AVFrame avframe) {

                if (type == 1) {
                    StartisIFrame = true;
                }
                if (StartisIFrame) {
                    if (recodeHelper.isSavingVideo()) {
                        recodeHelper.saveAvFrame(avframe);
                    }
                }
                // the data decoded to the GL view live_monitorgl
                live_monitorgl.decoderVideoDataOpenGL(DemoLiveActivity.this,did, h264, type, size, onlinenum, timesec, avframe,live_monitorgl);

                // here I check the time
                if (timesec > lastTimesec)
                {
                    try {
                        // get the last playing view as bitmap & pass it to the AsyncTask
                        Bitmap bitmap = live_monitorgl.getLastPlayingView();
                        new ProcessCurrentFrame().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, bitmap);
                    }
                    catch (Exception ex) {// do nothing
                    }
                    lastTimesec = timesec;
                }
            }
        });
    }

Код AsyncTask:

private class ProcessCurrentFrame extends AsyncTask<Bitmap, Void, Void>
    {

        @Override
        protected Void doInBackground(Bitmap... bitmaps)
        {
            if (bitmaps.length>0)
            {
                final Bitmap bitmapImageFromGLView = bitmaps[0];
                if (bitmapImageFromGLView!=null)
                {
                    //Detect the face using ML kit api
                    FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(bitmapImageFromGLView);
                    detector.detectInImage(image).addOnSuccessListener(
                        new OnSuccessListener<List<FirebaseVisionFace>>()
                        {
                            @Override
                            public void onSuccess(List<FirebaseVisionFace> faces) {
                                // Task completed successfully
                                // ...
                                Log.d("IN Background","====== PROCESSING ======");
                                if (faces.size()>0)
                                {
                                    Log.d("HEHEHE", "====== Face Found ========");
                                    synchronized (bitmapImageFromGLView) {
                                        SavePhoto savePhoto = new SavePhoto(bitmapImageFromGLView, DemoLiveActivity.this, handler);
                                        String APPLICATION_SAVE_URL = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath() + "/cameraApp/";
                                        File var20 = new File(APPLICATION_SAVE_URL);
                                        savePhoto.savePhotoToPath(APPLICATION_SAVE_URL, var20.getAbsoluteFile() + "/image"+count+".jpg");
                                        count++;
                                        System.gc();
                                    }
                                }
                            }
                        });
                }
            }
            return null;
        }
    }

Предыдущий код очень медленно распознает лица, и я не уверен, будет ли хорошей практикой запускать новый AsynkTask каждую секунду для обработки текущее растровое изображение.

Любое предложение для лучшего решения?

...