版权声明:本文使用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.

*

If this is never called, the default format will be

* {@link android.graphics.ImageFormat#NV21}, which

* uses the NV21 encoding format.

*

* 此处省略部分内容

*

* @param pixel_format the desired preview picture format, defined by

* one of the {@link android.graphics.ImageFormat} constants. (E.g.,

* ImageFormat.NV21 (default), or

* ImageFormat.YV12)

*

* @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() {

@Override

public 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 摄像头亮度,[Android相机]通过手机摄像头识别环境亮度相关推荐

  1. 摄像头分辨率怎么调整_手机摄像头测试:细数手机摄像头由单摄到多摄有哪些变化...

    手机摄像头分为前置和后置,随着手机屏幕占比越来越大,留给前置摄像头的空间也越来越小,同时后置多摄像头技术正占据潮流,这就对手机摄像头模组的外形尺寸和功能有了更高的要求.在手机摄像头的测试中,应用弹片微 ...

  2. 电脑使用android手机摄像头,电脑怎么使用安卓手机摄像头 电脑使用手机摄像头的方法-电脑教程...

    现在安卓手机基本上都配备了1300w像素,那么这个高的像素是不是只有在手机上拍照的功能呢?答案是否定的,这里教大家物尽其用,来弥补笔记本和usb摄像头的缺点.也就是在电脑上使用安卓手机的摄像头.从而在 ...

  3. android camera 3a,买相机送手机 pixel 3a 上手体验

    买相机送手机 pixel 3a 上手体验 2019-05-29 08:29:42 23点赞 14收藏 20评论 创作立场声明:独立主观有点方 购买理由 有人说过,人生就是连续的选择题,人们总是在取与舍 ...

  4. html调起苹果手机摄像头_使用HTML5+调用手机摄像头和相册

    前言: 前端时间使用HTML5作了一个WEB端APP,其中用到了H5页面调用手机摄像头的功能,当时也是花了很多时间去研究.最终是采用了HTML5plus(HTML5+)的方式完成了该功能,现将具体方法 ...

  5. 切换不了摄像头 高拍仪_手机摄像头模组支架保护膜的变革之路

    作为模切人,回想工作的这几年,尝尽社会的辛酸艰难,从一开始什么都没有到30万,从30万到200万,从200万到1300万,不是炫耀,我只是想通过我自己的经历告诉我的朋友们:手机像素越高,拍的照片越清晰 ...

  6. android 6无法连电脑,安卓手机不识别U盘、不能连接PC的处理方法

    一.安卓手机不识别u盘 手机外接优盘,就是OTG功能,OTG功能就是On-The-Go的英文缩写,字面上可以理解为"安上即可用".而作为无线通讯设备或是移动设备的一项拓展功能,其实 ...

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

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

  8. android 系统亮度,android 设置系统屏幕亮度

    android 设置系统屏幕亮度 权限 /** * 获得当前屏幕亮度的模式 * SCREEN_BRIGHTNESS_MODE_AUTOMATIC=1 为自动调节屏幕亮度 * SCREEN_BRIGHT ...

  9. python 控制手机摄像头_python+open cv调用手机摄像头,保存文件

    import cv2 cv2.namedWindow("camera", 1) # 开启ip摄像头 video = "http://admin:admin@192.168 ...

最新文章

  1. 导入表编程-枚举导入表
  2. EditText 自动保留两位小数
  3. python免费网络采集_python网络数据采集7 采集一个网站所有的外链
  4. php命名空间更麻烦了,紧急求教PHP命名空间问题,12:10了我还没有吃饭呢,各位帮忙!!...
  5. php 模拟表单提交-get-post
  6. 139团队(大型研发团队,大型敏捷开发团队,大型团队结构,敏捷绩效管理)...
  7. 从零开始--系统深入学习IOS(使用Swift---带链接)
  8. 区块链供应链金融应用场景解决方案
  9. think in java 读书笔记 1 ——移位
  10. 为什么手机浏览器打不开html文件,手机浏览器打不开网页的解决方法
  11. 第一个用python实现的数据化运营分析实例——销售预测
  12. 注册表-在IE上永久显示我的名字www.baidu.com - 朱建强
  13. 关于Google翻译和语音朗读功能无法正常使用的说明
  14. php出生年月日怎么写,出生年月日五行查询表,五行属性查询表
  15. gem意思_邓紫棋为什么叫GEM 每次改名都有意义
  16. 在linux下vcd光盘提取,在Linux中制作VCD
  17. 光学接触角计算机软件,悬滴法表界面张力仪及接触角仪
  18. 智慧园区解决方案-数字孪生-最新全套合集
  19. excel人事必学合同到期提醒
  20. 技法の穴をふさぐ:規模編--技法のルールは分かりにくい数え方の“迷い”をなくす

热门文章

  1. Mattermost桌面端使用代理访问服务器
  2. 【python】 16进制字符串转list
  3. 走进产品经理(最佳培训教材)
  4. rscp胎位图_胎位图(附图片)——妈妈提前看
  5. 同事离职了,你怎么看?
  6. Ajax 服务器软件安装、以及Ajax介绍
  7. 一文看懂PCB助焊层跟阻焊层的区别与作用
  8. 解决谷歌浏览器跨域错误问题
  9. 大型报告厅,会议中心解决方案
  10. 制作Knoppix USB启动盘