卧式纯绿 2024-04-14 16:16 采纳率: 62.1%
浏览 8
已结题

安卓开发视频抽帧检测后展示

安卓开发在进行视频实时检测时遇到问题
准备将从相册获取的视频uri进行抽帧提取,每一帧进行目标识别检测(绘制边界框 打上标签)之后再创建线程展示出来
以下是GPT给出的代码,照着写了一下,感觉没什么问题,就是在手机上运行就会出bug

img


下面是处理视频的代码:

img


获取处理后的图像后进行实时展示(想要的效果就是以一个视频的形式展示)

img

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2024-04-14 16:16
    关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    问题描述:在进行安卓视频实时检测时,从相册获取的视频uri进行抽帧提取后每一帧进行目标识别检测,绘制边界框,打上标签后进行展示,但运行时会出现bug。

    解决方案:

    1. 对于获取到的视频Uri进行处理

    在获取到视频Uri后,可以使用MediaMetadataRetriever类对视频进行处理,获取视频的信息,包括时长、关键帧等。通过设置getFrameAtTime()方法获取每一帧的数据。

    1. 创建线程进行检测

    对于每一帧数据进行目标识别检测,一般需要耗费较多的计算资源,建议使用线程或异步任务进行处理。

    1. 更新UI显示处理后的帧

    在处理完成后,需要将处理后的帧显示出来。可以通过更新ImageView的方式,使用runOnUiThread()方法更新UI。

    修改后的代码如下:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode,resultCode,data); if (resultCode == RESULT_OK) { try { if (requestCode == SELECT_IMAGE && data != null) { // 处理图片 } else if (requestCode == TAKE_PHOTO) { // 拍照 } else if (requestCode == SELECT_VIDEO) { Uri videoUri = data.getData(); // 获取视频Uri // 处理视频 processVideo(videoUri); } } catch (FileNotFoundException e) { Log.e("MainActivity", "FileNotFoundException"); return; } }

    private void processVideo(Uri videoUri) { MediaMetadataRetriever retriever = new MediaMetadataRetriever(); retriever.setDataSource(this, videoUri); String timeFormat = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); long videoLengthInMills = Long.parseLong(timeFormat) * 10; // 微妙转换成毫秒 long FrameInterval = 34; // 帧间隔34毫秒相当于1秒30帧 // 创建线程或异步任务处理视频 new Thread(() -> { for(long atTime = 0; atTime < videoLengthInMills; atTime += FrameInterval) { Bitmap bitmap = retriever.getFrameAtTime(atTime * 1000, MediaMetadataRetriever.OPTION_CLOSEST); if (bitmap != null) { // 进行目标检测处理 YoloV5Ncnn.Obj[] objects = yolov5ncnn.Detect(bitmap, use_gpu: true); Bitmap newBitmap = performObjectDetection(objects); // 更新检测处理后的bitmap值 // 更新UI显示处理后的帧 updateUiWithProcessedFrame(newBitmap); } } try { retriever.release(); // 释放资源 } catch (IOException e) { throw new RuntimeException(e); } }).start(); }

    private void updateUiWithProcessedFrame(Bitmap bitmap) { runOnUiThread(() -> // 更新ImageView.显示处理后的帧 imageView.setImageBitmap(bitmap); ); }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月17日
  • 已采纳回答 8月9日
  • 创建了问题 4月14日