摄像头实例讲解

作者:创世魂

 

 

一、摄像头类

 

● 本类说明

 

帮助说明:

通过本类可以调用“摄像头”,然后创建相机,实现拍照等事件。

简单来说,通过本类可以自己开发一个简单的相机软件。

如果要访问指定摄像头,需要使用“打开”方法,默认访问“后置摄像头”

注意:本类位于“多媒体功能支持”模块中,必须添加此模块才能使用。

 

● 打开

 

帮助文档如下图:

即打开指定摄像头,默认为“后置摄像头”

可通过“摄像头类.前置摄像头”来打开前置。

 

● 锁定

 

帮助文档如下图:

顾名思义,锁定当前相机仅当前程序可用。

如果想让其它软件访问相机,需要执行“解锁”方法。

 

● 解锁

 

帮助文档如下图:

顾名思义,解锁相机让其它程序访问。

 

● 置展示组件

 

帮助文档如下图:

顾名思义,设置拍摄时显示图像的组件。

该组件为高级画板,务必保证画板在窗口界面上。

 

● 开始预览

 

帮助文档如下图:

在绑定的“高级画板”上显示相机画面。

 

● 停止预览

 

帮助文档如下图:

暂停当前画面预览,“高级画板”上显示的界面将停留在最后一帧上。

 

● 开始聚焦

 

帮助文档如下图:

本方法即我们常说的“对焦”

 

● 开始检测脸部

 

帮助文档如下图:

安卓内置的2D人脸检测方法,本方法调用后会不停的发送“检测到人脸”事件。

本方法不建议用来做人脸识别功能,因为照片也可以识别。

 

● 停止检测脸部

 

帮助文档如下图:

顾名思义,调用本方法后,将会停止人脸检测。

 

● 拍照

 

帮助文档如下图:

顾名思义,执行本方法后会触发“触发快门”“得到图像数据”事件。

并且“得到图像数据”事件会触发三次,得到三种不同的图片数据。

 

● 释放

 

帮助文档如下图:

顾名思义,释放当前相机所占用的资源。

 

● 前置摄像头(常)
● 后置摄像头(常)

 

帮助文档如下图:

以上两个为常量值,通过“摄像头类.XXX”即可调用。

主要作用就是提供给“打开”方法。

 

● 快门声(写)

 

帮助文档如下图:

通过本“写属性”可以设置是否开启快门声。

本属性并不保证所有设备都可以正常使用,部分手机强制开启快门。

快门声音为系统相机的快门声音。

 

● 显示角度(写)

 

帮助文档如下图:

“写属性”用来设置预览画面时的角度。

总共四个角度,分别为:0,90,180,270度。

 

● 得到图像数据(事件)

 

帮助文档如下图:

通过“拍照”方法触发本事件,本事件总共会触发三次,得到三种不同的图片数据。

分别为:“0=未压缩的原始数据”

“1=预览数据”“2=JPEG最终保存数据”

预览数据:通常用来作为拍照完毕后,相机画面显示的数据。

 

● 检测到人脸(事件)

 

帮助文档如下图:

当执行“开始检测脸部”后,会不停的发送本事件。

通过本事件中“摄像头脸部类”可以获得人脸数据,关于本类教程中会详细介绍。

 

● 聚焦完毕(事件)

 

帮助文档如下图:

执行“聚焦”方法,聚焦完毕后会发送本事件。

还可以通过“聚焦成功”参数来判断是否对焦成功。

 

● 触发快门(事件)

 

帮助文档如下图:

执行“拍照”方法会触发本事件。

根据自己的实际需求,决定是否在本事件下执行相应的方法。

 

● 预览缓存数据(事件)

 

帮助文档如下图:

当打开摄像头后,本事件会不停的发送。

本事件下的“预览数据”参数,返回的并非正常的图片数据。

可以理解为拍摄时产生的垃圾文件。

 

界面准备如下图:

在上一个类的基础上,增加一个按钮,分别修改这三个按钮的标题。

修改完毕后点击“确定”保存布局。

 

代码编写(1):

增加一个“摄像头类”成员变量,起名“摄像头”

右键“摄像头类”选择添加“事件接收方法”

 

代码编写(2):

随后分别依次添加“得到图像数据”“触发快门”“聚焦完毕”“预览缓存数据”“检测到人脸”事件。

注意:“被缩放”“预览数据”“开始移动聚焦”这三个事件实测无效,不讲解。

注意:“发生错误”事件,仅在拍摄时出错的情况下才会触发。

正常情况下根本不会出错,本事件触发的可能性极低,因此不再讲解。

 

代码编写(3):

“得到图像数据”事件下,判断来源对象后继续判断“触发标志”参数。

通过判断不同的标志,来保存不同的“图片数据”字节数组。

使用的方法是“写出文件”,可点击跳转查看具体帮助文档。

注意:最后一个触发标志被触发后,如果不再使用摄像头。

建议调用“停止预览”“解锁”“释放”方法。

 

代码编写(4):

分别在“触发快门”“聚焦完毕”“预览缓存数据”下执行你想要执行的方法即可。

 

代码编写(5):

调用“开始检测脸部”后,会触发本事件。

通过“脸部数据”参数可以获得人脸坐标等数据。

详细说明可跳转查看“摄像头脸部类”

本例子中,判断“数组成员数”的目的,是为了防止没有检测到人脸。

通过“脸部数据”参数,可以看出它是一个数组类的参数。

也就表明,检测人脸时会将画面内出现的人脸全部进行检测。

 

代码编写(6):

最后在“按钮被单击”下,判断按钮来源,执行对应的方法即可。

 

运行结果如下图:

可以看到“文本框1”显示可信度为“91”

高达90以上的基本可以确定为人脸。

图文教程仅能演示到此,其它方法自行测试。

 

● 取消聚焦

 

帮助文档如下图:

顾名思义,取消当前所有的对焦动作。

如果遇到摄像头反复对焦的情况(极少遇见),可执行本方法取消对焦操作。

调用方法:“摄像头变量.取消聚焦()”

 

● 异步拍照

 

帮助文档如下图:

本方法和“拍照”方法功能一样,不同之处是使用本方法“拍照”界面不会发成卡顿现象。

调用方法:“摄像头变量.异步拍照()”

 

● 重新连接

 

帮助文档如下图:

假如:当前程序需要让其它程序临时访问相机。

访问结束后,需要调用本方法让当前程序重新连接到摄像头。

调用方法:“摄像头变量.重新连接()”

 

● 摄像头数量(读)

 

帮助文档如下图:

通过本读属性获得前后摄像头的总数量。

手机前后双摄,三摄,或者更多摄像头,均会识别为一个摄像头。

也就意味着,只要手机存在前后摄像头,此方法必然返回“2”

 

界面准备:

在原界面的基础上,修改“按钮3”的标题为“摄像头数量”

 

代码编写如下图:

“按钮3”被单击后,利用本方法读取数量,赋值给文本框的内容。

 

运行结果如下图:

下图为真机(小米6)运行截图,手机为后置双摄前置单摄,可以看到返回的是“2”

注意:想要读取摄像头数量,必须打开相机才可以读取。

 

 

二、摄像头脸部类

 

● 本类说明

 

帮助文档如下图:

顾名思义,通过本类实现了对人脸检测方面的操作。

本类中共有六个读属性。

本类并不能直接创建或者调用,需要通过“摄像头类_检测到人脸”事件才能获取当前对象。

各个方法的帮助说明,如下图所示,不再单独讲解。

“脸部ID”获得当前脸部唯一ID值,可以将ID值存储起来,用于简单的人脸识别。

当然并不建议使用本属性,因为2D人脸识别极其不安全,并且有重复ID的可能性。

 

代码编写如下图:

直接在“摄像头类_检测到人脸”事件下,通过“脸部数据”参数调用对应的方法就可以读取相关信息。

本例程中的代码,设置了只有当画面内出现“两张人脸”时才会反馈检测数据。

 

运行结果如下图:

左眼,右眼和嘴部返回“null”,是因为检测失败导致的。

脸部ID返回“-1”同样也是因为检测失败返回的数据。