Я хочу обнаружить лица по потоковому видео с тепловой камеры. Поставщик тепловой камеры предоставляет мне исходный код, используемый для подключения к камере и для потоковой передачи видео с нее.
каждый раз, когда видеоданные изменяются на камере, выполняется функция обратного вызова. Итак, что я сделал, чтобы определять лица каждый раз, когда вызывается функция обратного вызова:
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 каждую секунду для обработки текущее растровое изображение.
Любое предложение для лучшего решения?