如何编写摄像头应用程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何编写摄像头应用程序相关的知识,希望对你有一定的参考价值。

参考技术A

编写一个可预览的Camera应用需要哪些步骤呢:

1、首先我们需要创建一个布局文件,也就是我们打开apk后显示的画面,因为是一个demo,所以我们的布局文件也很简单,就一个SurfaceView,用来现实Camera预览画面的,代码如下:

2、接下来就是在主类中onCreat加载布局文件,同时初始化控件调用initView(),在android6.0 之后要求app需要获取系统权限,比如打开camera的权限,读写sdcard的权限等(用来存图,读取配置文件等)

3、 在initView中初始化了SurfaceView控件,同时需要装载SurfaceHold对象,用来监听SurfaceView的生命周期,我们可以把camera相关的初始化流程(initCamera2)装载在这个位置,为后面的camera打开流程做准备

4、在Camera的初始化流程中,我们启动了一个线程,同时设置了图像的数据格式和分辨率,建立一个图像可用监听器,为后面需要拍照或者做帧数据处理提供接口,如果你仅仅是为了预览,就只用建立一个线程就可以了,直接跳过第5步,看第6步就行

5、重写onImageAvailable 方法,可以在此处做一些你需要的处理,需要注意的是要这里能获取到数据,在后面需要将ImageRead的对象装载到后面previewRequestBuilder 中才行

6、在onCreat中我们去申请了权限,在权限申请ok后,会到下面这个回调函数中,我们在这个函数中去开启camera

 

7、开启camera的方法也很简单,就是获取到系统的Camera服务,然后直接调用openCamera方法开启,注意第一个参数cameraId就是camera的id号,一般1是前置,0是后置

8、在openCamera函数执行成功后,会进入stateCallback回调函数,这个里面就有三个方法,分别对应打开摄像头,断开摄像头以及报错的回调,我们在打开摄像头中加载预览函数,进入预览流程,同时要在断开摄像头中将CameraDevice释放

9、现在进入了Camera的预览流程了,我们依然使用系统的接口,首先是获取到CaptureRequest的builder,然后将surfaceView的对象加载进入,最后调用setRepeatingRequest方法进行数据预览。

(如果想让第5步中的方法也能跑起来,这里需要装载进ImageRead的对象,增加方法是

Arrays.asList(outputTarget)

修改为:

Arrays.asList(outputTarget,mImageReader.getSurface())

如何使用小程序从 Java 中的网络摄像头捕获视频?

【中文标题】如何使用小程序从 Java 中的网络摄像头捕获视频?【英文标题】:How can I capture video from a webcam in java with an applet? 【发布时间】:2011-08-07 13:34:45 【问题描述】:

我希望使用 java 小程序通过网络捕获和流式传输视频。到目前为止,JMF 似乎已经过时,FMJ 无法以任何合理的速度进行捕捉。是否有任何其他库可用于以每秒至少 10-15 帧的速度从网络摄像头捕获和/或流式传输视频?

【问题讨论】:

【参考方案1】:

我最近这样做了,不得不编写一个 JNI 来捕获视频并对其进行编码或解码。

这很痛苦,因为您必须为每个平台编写 JNI,例如 Windows 32 和 64 位、OSX 32 和 64 位以及 Linux 32 和 64 位。

使用 JNLP(Java Web 启动)是比小程序更好的选择,因为它允许您对其进行设置,以便自动为当前操作系统下载和安装正确的 JNI。

JNLP 或 Applet 都需要您生成签名的 jar 才能工作。

【讨论】:

在这种情况下,我可能只使用 OpenCV 进行捕获。 是的,如果还没有 JNI 包装器,您可以将 OpenCV 包装在 JNI 中,您也可以考虑使用 JNA 直接调用 OpenCV。

以上是关于如何编写摄像头应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在移动网络应用程序上全屏查看网络摄像头 [重复]

delphi 利用简易摄像头编写监控的程序

Camera | 4.瑞芯微平台MIPI摄像头应用程序编写

如何使用小程序从 Java 中的网络摄像头捕获视频?

编写虚拟网络摄像头?

字符设备驱动程序--LED驱动