Android Studio开发之路(七)CameraX&&Opencv的使用

这篇具有很好参考价值的文章主要介绍了Android Studio开发之路(七)CameraX&&Opencv的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前情提要以及工作目标

工作目标:做一个显示单通道图像的相机,实现预览和拍照。
原本是调用opencv-android里边的JavaCamera2View来实现,这个用起来比较方便,它提供了集成好的相机预览界面,并且提供了帧处理函数。但是问题是用opencv相机获取到的帧图片分辨率不高,达不到目标效果。
而CameraX作为Google发行的相机处理库,可以方便的做分辨率设置、对焦等操作,于是决定使用Camerax+opencv的方式完成工作目标。

二、CameraX基础

CameraX
Camerax(Android developer)
Camerax发布会(谷歌中国)
Camerax入门指南

三、工作几大难点以及解决方案

(1). 开发语言与版本

CameraX主流语言是Kotlin, 网上帖子用的也大多是Kotlin,而我使用的是Java
并且Camerax目前为止发行了不少的版本,还分了alpha,beta版本,不同的版本代码页不完全兼容。Java开发尽可能选择比较新的版本
Android CameraX 1.1.0 Java版本使用教程(Java)

(2). ImageProxy对象转Mat

CameraX将相机应用的主流场景分成三个“用例”,每个用例都可以单独使用:
预览:将相机捕获的画面显示在屏幕上,PreviewView
拍照:拍摄保存图片
分析ImageAnalysis:提供每一帧图像用于处理。
分析用例提供的是 ImageProxy对象,帧图片是YUV类型,但是opencv处理的是Mat,所以需要进行转换,可参考这篇文章:
YUV转Mat

(3).图片处理后的再显示

我需要将每一帧处理后的图像想普通相机那样再显示在界面上,但是CameraX的分析用例没有提供返回,而且要将mat再转回也比较麻烦,所以普遍的方式是在预览界面的上面再叠放一个ImageView,每处理一帧就用ImageView显示出来。(根据我的目标,我只要显示处理之后的帧,所以我干脆没有使用预览用例)。

这里还要注意显示的大小。我的ImageAnalysis分辨率设置的是1280x720, 显示出来是不能占满屏幕的,那么就有两种处理方式:

1.使用ImageView的缩放设置setScaleType

ScaleType缩放设置

2.使用opencv的resize()函数

CameraX的预览用例官方文档中给出了预览时的缩放规则,我仿照这个规则使用resize函数将负片进行缩放,并且ImageView缩放类型设置为Center
CameraX预览用例

    private class MyAnalyzer implements ImageAnalysis.Analyzer {
        @SuppressLint("UnsafeOptInUsageError")
        @Override
        public void analyze(@NonNull ImageProxy image) {
            Log.d(TAG, "Image's stamp is " + Objects.requireNonNull(image.getImage()).getTimestamp());
            Image img = image.getImage();

            int rotation = image.getImageInfo().getRotationDegrees();

            //在opencv的JavaCamera2View.java中添加了ImageUtil类,用于YUV类型到mat的图片转换
            ImageUtil imgutil = new ImageUtil(img);
            Mat rgb = imgutil.rgba();
            imgutil.rotation(rotation, rgb);    //图片旋转

            mChannelB = new Mat(rgb.height(), rgb.width(), CvType.CV_8UC1);
            //clahe 用于进行图像边缘增强对比度
            CLAHE clahe = createCLAHE();
            clahe.setClipLimit(8);
            clahe.setTilesGridSize(new Size(8, 8));
            //通道拆分,仅显示单通道图像
            List<Mat> imgList = new ArrayList<Mat>();
            Core.split(rgb, imgList);
            clahe.apply(imgList.get(2), mChannelB);

            //获取屏幕尺寸
            DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
            int width = displayMetrics.widthPixels;
            int height = displayMetrics.heightPixels;
            double mu=Math.max(mlay.getWidth()*1.0/mChannelB.width(),mlay.getHeight()*1.0/mChannelB.height());

            Mat reRgb=new Mat();
            resize(mChannelB,reRgb,new Size(0,0),mu,mu,INTER_CUBIC);

            Bitmap bitmap = Bitmap.createBitmap(reRgb.width(), reRgb.height(), Bitmap.Config.ARGB_8888);
            Utils.matToBitmap(reRgb,bitmap);

            //TODO 处理我们要对Mat做的业务计算
            imgutil.release(); //要释放资源哦


            //  Toast.makeText(MainActivity.this,"mChannelB size:"+mChannelB.width()+";"+mChannelB.height(),Toast.LENGTH_SHORT).show();
         /*   String path= Environment.getExternalStorageDirectory()+"/DCIM/Camera/";
            //将拍摄准确时间作为文件名
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
            String filename = sdf.format(new Date());
            String filePath= path  + filename + ".jpg";
            Imgcodecs.imwrite(filePath, mChannelB);
*/

            image.close();
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    m_imageView.setImageBitmap(bitmap);
                    String size=mlay.getWidth()+"/"+mlay.getHeight()+";"+bitmap.getWidth()+"/"+bitmap.getHeight()+";"+m_imageView.getWidth()+"/"+m_imageView.getHeight()+";"+reRgb.width()+"/"+reRgb.height()+";mu:"+mu;
                    m_textView.setText(size);
                    //  Toast.makeText(MainActivity.this,"imageview size:"+m_imageView.getWidth()+";"+m_imageView.getHeight(),Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

Android Studio开发之路(七)CameraX&&Opencv的使用,Android Studio开发之路,android studio,opencv,android文章来源地址https://www.toymoban.com/news/detail-811415.html

到了这里,关于Android Studio开发之路(七)CameraX&&Opencv的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学习笔记—Android studio导入OpenCV配置使用

    官网下载sdk,打开opencv官网,点击Android,完成后解压 https://opencv.org/ 解压后,文件夹下有这些文件 samples Android代码工程 sdk 包含opencv的Java的接口和JNI接口等 打开Android studio,选择模板,这时选择最后一项Native C++,然后进入配置界面。 这里注意你下载的Android-sdk版本来选择

    2024年02月07日
    浏览(12)
  • Android CameraX适配Android13的踩坑之路

    最近把AGP插件升级到8.1.0,新建项目的时候目标版本和编译版本都是33,发现之前的demo使用Camerax拍照和录像都失败了,于是查看了一下官网和各种资料,找到了Android13的适配方案. 与早期版本一样,Android 13 包含一些行为变更,这些变更可能会影响您的应用。以下行为变更仅影

    2024年02月12日
    浏览(14)
  • Android studio 使用C/C++开发app

    一、在新建项目中选择Native C++,然后下一步 二、名字跟保存位置自定义,语言选择Java,SDK根据app安装的平台选择对应的版本,选好后下一步  三、C++ Standard默认选择就可以,点击完成  四、加载完成后,把项目标题Android换成项目  换完后的列表    C/C++的代码在cpp文件夹中

    2024年02月12日
    浏览(12)
  • Android Studio中使用cmake开发JNI实战

    JNI学习大纲 一、JNI编程入门 二、Android Studio中使用cmake开发JNI实战 第一章节我们介绍了JNI的开发步骤,那这一章节我们就开始在Android Studio中实战一下吧,Let\\\'s Start。 AS中菜单栏选择ToolsSDK Manager 在Android SDK中选择SDK Tools,安装CMake和NDK。 在项目工程下的src/main创建cpp目录,编

    2024年02月14日
    浏览(17)
  • Android Camera开发入门(3):CameraX的使用

    CameraX API简介 在前两篇博客中,我们介绍了Camera基础知识和Camera2 API的使用。为了进一步简化相机应用开发,Google推出了CameraX API,它提供了一个更加简洁、易于使用的接口,帮助开发者快速实现高质量的相机功能。本篇博客将带领你了解CameraX的使用方法,并提供相应的示例

    2024年02月11日
    浏览(12)
  • 【常用开发工具】保姆级教程Android Studio安装和基本使用

    🔎这里是【常用开发工具】,关注我学习编程不迷路 如果对你有帮助,给博主一个免费的点赞👍以示鼓励 欢迎各位🔎点赞👍评论收藏⭐️ 👀专栏介绍 【常用开发工具】 目前更新IDEA、Tomcat、Maven、Git等预计会开10+期,大家一起学习一起进步。 📢📢有写的不好或写错的地

    2023年04月16日
    浏览(13)
  • 移动开发作业三:使用Android studio来实现简单的计算器

    一.实验要求 结合所学内容利用Android studio来设计一个开发实例,这里去我选择做一个简易的计算器,可以初步实现加减乘除。 二.实验功能 该计算器与我们平常手机上的计算器一样,可以进行加减乘除操作。 三.实验过程 1.首先是关于计算器的布局 在layout文件下的drawable文件

    2024年02月02日
    浏览(17)
  • 安卓大作业:使用Android Studio开发天气预报APP(使用sqlite数据库)

    今天我来分享一下如何使用Android Studio开发一个天气预报APP。在文中,我们将使用第三方接口获取实时天气数据,并显示在APP界面上。 首先,打开Android Studio并创建一个新的项目。在创建新项目时,我们需要设置项目名称、包名和支持的最低API级别。 为了获取实时天气数据,

    2024年02月08日
    浏览(13)
  • Android studio实现财务记账系统软件android studio开发课程设计

    Android 开发一个理财记账系统软件(app)的详细实验步骤,内附有源码,小白也能轻松上手自己的软件开发项目学生可当课程设计学习使用。 系统登录/退出 设置/修改密码 主活动页面设计 增加收入记录页面 查看收入记录页面 修改和删除记录页面 1、实验名称 数据库的创建 2.

    2024年02月10日
    浏览(20)
  • OpenCV(一):Android studio jni配置OpenCV(亲测有效,保姆级)

    目录 1.下载OpenCV的SDK 2.创建Android Native C++项目 3.Android项目中导入OpenCV工程 4.导入OpenCV的库文件 5.实现opencv高斯模糊图像处理的demo 要在Android Studio中配置使用OpenCV库的C++方法,需要完成以下步骤: 1.下载OpenCV的SDK 首先,您可以从OpenCV官方网站(Releases - OpenCV )下载适用于And

    2024年02月03日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包