版权声明:本文使用https://creativecommons.org/licenses/by-nc-nd/4.0/规定的《署名-非商业性使用-禁止演绎 4.0 国际》协议 https://blog.csdn.net/bluewindtalker/article/details/79999172

本篇文章即为通过一系列的方法获得当前摄像头所处环境的亮度,最相近的就是微信的扫一扫提示“轻触照亮”打开手电筒的功能,首先我们看一个方法setPreviewFormat方法,在注释中我们可以清楚的看到默认使用NV21格式,

/*** Sets the image format for preview pictures.* <p>If this is never called, the default format will be* {@link android.graphics.ImageFormat#NV21}, which* uses the NV21 encoding format.</p>** 此处省略部分内容** @param pixel_format the desired preview picture format, defined by*   one of the {@link android.graphics.ImageFormat} constants.  (E.g.,*   <var>ImageFormat.NV21</var> (default), or*   <var>ImageFormat.YV12</var>)** @see android.graphics.ImageFormat* @see android.hardware.Camera.Parameters#getSupportedPreviewFormats*/public void setPreviewFormat(int pixel_format) {String s = cameraFormatForPixelFormat(pixel_format);if (s == null) {throw new IllegalArgumentException("Invalid pixel_format=" + pixel_format);}set(KEY_PREVIEW_FORMAT, s);}

NV21是什么格式呢?NV21是YUV格式的一种,YUV主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。其中转换公式为(RGB取值范围均为0-255)︰

    

其实他们的转化矩阵是

    

那NV21的具体编码格式是什么样呢,NV21格式就是YUV420SP格式,

NV21的存储格式是YYYYYYYY VUVU

而 NV12存储格式是 YYYYYYYY UVUV,

下图为I420格式: YYYYYYYY UU VV

同过上图我们得知,如果拿到亮度即为拿到Y值即可,而Y值是数组中前N个(N为图像宽乘以高得到的像素点总数)。

https://blog.csdn.net/bluewindtalker/article/details/79999172

我们先看下摄像头识别的代码通过调用setPreviewCallback方法,在回调的方法中获得NV21格式的byte数组,这个数组即为上述格式,通过对NV21的data数组进行亮度数值采集获得图片的总亮度,然后除当前采集的像素点个数即为当前图片的平均值。下面看具体实现:

    //上次记录的时间戳long lastRecordTime = System.currentTimeMillis();//上次记录的索引int darkIndex = 0;//一个历史记录的数组,255是代表亮度最大值long[] darkList = new long[]{255, 255, 255, 255};//扫描间隔int waitScanTime = 300;//亮度低的阀值int darkValue = 60;private void setPreviewLight() {//不需要的时候直接清空
//        if(noNeed){
//            camera.setPreviewCallback(null);
//            return;
//        }camera.setPreviewCallback(new Camera.PreviewCallback() {@Overridepublic void onPreviewFrame(byte[] data, Camera camera) {long currentTime = System.currentTimeMillis();if (currentTime - lastRecordTime < waitScanTime) {return;}lastRecordTime = currentTime;int width = camera.getParameters().getPreviewSize().width;int height = camera.getParameters().getPreviewSize().height;//像素点的总亮度long pixelLightCount = 0L;//像素点的总数long pixeCount = width * height;//采集步长,因为没有必要每个像素点都采集,可以跨一段采集一个,减少计算负担,必须大于等于1。int step = 10;//data.length - allCount * 1.5f的目的是判断图像格式是不是YUV420格式,只有是这种格式才相等//因为int整形与float浮点直接比较会出问题,所以这么比if (Math.abs(data.length - pixeCount * 1.5f) < 0.00001f) {for (int i = 0; i < pixeCount; i += step) {//如果直接加是不行的,因为data[i]记录的是色值并不是数值,byte的范围是+127到—128,// 而亮度FFFFFF是11111111是-127,所以这里需要先转为无符号unsigned long参考Byte.toUnsignedLong()pixelLightCount += ((long) data[i]) & 0xffL;}//平均亮度long cameraLight = pixelLightCount / (pixeCount / step);//更新历史记录int lightSize = darkList.length;darkList[darkIndex = darkIndex % lightSize] = cameraLight;darkIndex++;boolean isDarkEnv = true;//判断在时间范围waitScanTime * lightSize内是不是亮度过暗for (int i = 0; i < lightSize; i++) {if (darkList[i] > darkValue) {isDarkEnv = false;}}Log.e(TAG, "摄像头环境亮度为 : " + cameraLight);if (!isFinishing()) {//亮度过暗就提醒if (isDarkEnv) {lightTV.setVisibility(View.VISIBLE);} else {lightTV.setVisibility(View.GONE);}}}}});}

实现效果我们可以看到

代码的git地址为:https://github.com/bluewindtalker/camerademo

[Android相机]通过手机摄像头识别环境亮度相关推荐

  1. android 摄像头亮度,[Android相机]通过手机摄像头识别环境亮度

    版权声明:本文使用https://creativecommons.org/licenses/by-nc-nd/4.0/规定的<署名-非商业性使用-禁止演绎 4.0 国际>协议 https: ...

  2. Android之让手机能识别当前app为浏览器类型的APP

    1 .问题 我们设置手机默认浏览器的时候,我们一般在"设置"页面,点击"默认应用管理",然后再点击浏览器,发现里面没有当前的app,但是会有一些QQ浏览器(前提 ...

  3. Android实现调用手机摄像头进行拍照并存储为文件

    目录 声明权限 拍照按钮触发事件` 后记 参考文章: 声明权限 首先应该在"AndroidManifest"文件中声明手机内存读写权限: <uses-permission a ...

  4. Android Studio 解决手机无法识别问题

    当电脑能够识别手机,而Android Studio 无法识别时候,需要在终端输入以下两条命令: system_profiler SPUSBDataType echo "0x2a45" ...

  5. windows Android Studio连接手机无法识别为安卓设备

    最近Mac坏了,掏出我11年前的Windows顶一下,在为 Android Studio 配置环境的时候,在连接真机进行调试的过程中,驱动程序都安装好了,手机开发者模式,USB调试全都打开了,但就是提 ...

  6. Android Studio连接手机无法识别为安卓设备

    最近为了毕设倒弄安卓,在为 Android Studio 配置环境的时候,在连接真机进行调试的过程中,驱动程序都安装好了,手机开发者模式,USB调试全都打开了,但就是提示无法将我的手机识别成 Andr ...

  7. 【Android -- 相机】调用摄像头拍照 选择照片

    效果图 现在很多应用中都会要求用户上传一张图片来作为头像,首先我在这接收使用相机拍照和在相册中选择图片.接下来先上效果图: 实现代码 1. 布局文件: <?xml version="1 ...

  8. Android实现调用手机摄像头录像限制录像时长

    因为服务器空间有限,所以视频时长必须有所限制. 在xml中先布局一个按钮,点击开始录频.布局一个TextView用于显示倒计时的时间. 一.使用Hander+TimerTask完成定时操作 priva ...

  9. CAMERA(12)---[Android相机]光线传感器识别环境光亮强度

    [Android相机]光线传感器识别环境光亮强度 关于Android相机的开发流程可以看前一篇文章, [Android 相机]Android 相机开发的基本流程 https://blog.csdn.n ...

最新文章

  1. 深度学习上的又一重点发现——利用MSCNN实现人群密度监测
  2. 时间复杂度,O(1), O(n), O(logn), O(nlogn) 的区别+样例分析
  3. 创建JAVASCRIPT对象3种方法
  4. Microsoft RTF栈溢出漏洞(CVE-2010-3333)漏洞分析
  5. SQL SERVER 2008 字段值合并
  6. Android在Context详细解释 ---- 你不知道Context
  7. python基本模块中的对象_Python 学习笔记 -- OS模块的常用对象方法
  8. Elasticsearch 内置分析器Analyzer
  9. spring mvc示例_Spring MVC示例
  10. Cmake构建_指定gcc/g++版本
  11. matlab哈明窗带阻,MATLAB数字滤波器程序 Hamming窗带通滤波器
  12. Pr 音频效果参考:滤波器与 EQ
  13. 淘宝店铺链接获取seller id,拿到店铺所有商品接口,接口接入技术解决方案
  14. linux centos ppp限速,Centos 中限制网络带宽速度
  15. PG数据库按照30分钟时间片统计数据
  16. Linu系统 rpm软件包 管理
  17. 凸包(Graham扫描法构建)
  18. Tableau实战 公司投资分析
  19. Codeup 1814.剩下的树
  20. 认为的文字可编辑的 pdf和图片展示的 pdf 做笔记的方式

热门文章

  1. 计算机运行很卡很慢,电脑运行太慢了太卡了怎么办(教你运行卡顿的解决方法)...
  2. 相似度系列-3:传统方法ROUGE ROUGE: A Package for Automatic Evaluation of Summaries
  3. 【Tensorflow】mnist_with_summaries.py报错
  4. (翻译)箭头和省略号的使用方式
  5. java将小写数字变成大写输出
  6. vue-i18n的使用,前端实现中英文切换
  7. 苹果系统 虚拟机_大连win10远程双系统重装电脑维修7苹果笔记本安装做虚拟机服务mac8...
  8. matlab棋盘格标定角点,相机标定(Camera calibration)Matlab——棋盘格标定原理,流程...
  9. html ios 视频播放不了,html中的video标签在ios微信中无法播放的解决方法之一
  10. UE4中的玩家类UPlayer、ULocalPlayer 和 UNetConnection