自定义相机Camera,相机/视频实时滤镜 - android

  使用相机或自定义相机,借助Android SDK Camera类的,或Camera2的类。全新的设计的Camera2是从 SDK 5.0(API Level 21)开始才被引入的,取代原来Camera.Java。用户系统版本参差不齐,所以暂时还是使用Camera来进行开发。Camera类被用于获取图片设置,start/stop 预览,快照图片,恢复视频编码的帧,Camera是一个client对于Camera Service来说,将管理Camera 硬件相关.新API android.hardware.camera2.  
  Android 5.0后用了Camera2下的API, 这些API不仅提供了Android系统的拍照功能,还能支持RAW照片输出,甚至允许程序调整相机的对焦模式,曝光模式,快门等。

  几个图像像素数据处理过程中的几个知识点:像素格式,图像拉伸,YUV像素取值范围,色域。

美颜有两步,一个是磨皮,一个是美白,要想正确美颜,所以还需要加上人脸识别技术和皮肤识别技术。

滤镜,图形变换处理核心是拿到纹理对象的rgb做算法处理.

  图像滤镜处理的两种方式:RGB点乘运算;GPU的矩阵运算(效率更高)。图片处理中的计算:RGBA~利用自带的方法修改色调,饱和度,亮度来修改图片;矩阵~利用矩阵计算得到新的矩阵修改图片。

Google相机开源方案- https://github.com/google/cameraview
做相机?首学Google 的开源相机方案!- https://mp.weixin.qq.com/s/t2uDAOTiLamKxAd1CmUbtQ
Android 5.0以下的API为Camera 而 Android 5.0以上的API为Camera2,并且各大手机厂商对于Camera2的支持程度也不同。
对于不支持Camera2的设备来说,需要降级使用Camera.常见有后台场景,锁屏场景。相机是共享资源,其它程序访问使用时容易发生冲突,因此需要正确地释放。

-- 相机对焦模式配置参数,可以通过Parameters.getFocusMode()接口获取。
Camera.Parameters.FOCUS_MODE_AUTO 自动对焦模式,摄影小白专用模式;
Camera.Parameters.FOCUS_MODE_FIXED 固定焦距模式,拍摄老司机模式;
Camera.Parameters.FOCUS_MODE_EDOF 景深模式,文艺女青年最喜欢的模式;
Camera.Parameters.FOCUS_MODE_INFINITY 远景模式,拍风景大场面的模式;
Camera.Parameters.FOCUS_MODE_MACRO 微焦模式,拍摄小花小草小蚂蚁专用模式;

-- 相机,场景模式配置参数,可以通过Parameters.getSceneMode()接口获取。
Camera.Parameters.SCENE_MODE_BARCODE 扫描条码场景,NextQRCode项目会判断并设置为这个场景;
Camera.Parameters.SCENE_MODE_ACTION 动作场景,就是抓拍跑得飞快的运动员、汽车等场景用的;
Camera.Parameters.SCENE_MODE_AUTO 自动选择场景;
Camera.Parameters.SCENE_MODE_HDR 高动态对比度场景,通常用于拍摄晚霞等明暗分明的照片;
Camera.Parameters.SCENE_MODE_NIGHT 夜间场景;

一个自定义 camera 1 - https://github.com/yangmingchuan/SunCamera
Camera2 - https://github.com/yangmingchuan/SunCamera/blob/f78570f4e2e68d1f86bb68e2dc00a344d4b3e101/app/src/main/java/cn/tongue/tonguecamera/ui/GoogleCameraActivity.java
android-Camera2Basic- https://github.com/googlesamples/android-Camera2Basic/#readme

> 自定义相机
--  Android系统提供了两种使用手机相机资源实现拍摄功能的方法:
  1.一种是直接通过Intent调用系统相机组件,这种方法快速方便,适用于直接获得照片的场景,如上传相册,微博、朋友圈发照片等。
  2.另一种是使用相机API来定制自定义相机,这种方法适用于需要定制相机界面或者开发特殊相机功能的场景,如需要对照片做裁剪、滤镜处理,添加贴纸,表情,地点标签等。

-- 摄像预览其实就是Android的Camera开发,对于Android的Camera开发,一般有两种方式,一种是借助Intent和MediaStroe调用系统Camera App程序来实现拍照和摄像功能,另外一种是根据Camera API自写Camera程序,自然第一种不能作为我们的滤镜开发,所以我们采用第二种方式。

  Camera:最主要的类,用于管理和操作camera资源。它提供了完整的相机底层接口,支持相机资源切换,设置预览/拍摄尺寸,设定光圈、曝光、聚焦等相关参数,获取预览/拍摄帧数据等功能
  SurfaceView:用于绘制相机预览图像的类,提供给用户实时的预览图像。普通的view以及派生类都是共享同一个surface的,所有的绘制都必须在UI线程中进行。(而surfaceview是一种比较特殊的view,它并不与其他普通view共享surface,而是在内部持有了一个独立的surface,surfaceview负责管理这个surface的格式、尺寸以及显示位置。)由于UI线程还要同时处理其他交互逻辑,因此对view的更新速度和帧率无法保证,而surfaceview由于持有一个独立的surface,因而可以在独立的线程中进行绘制,因此可以提供更高的帧率。自定义相机的预览图像由于对更新速度和帧率要求比较高,所以比较适合用surfaceview来显示。

-- Android HOME键、锁屏对SurfaceView的影响:
  1.在自定义相机页面按HOME键时的执行流程:
 程序运行->按HOME键;Activity调用的顺序是onPause->onStop;SurfaceView调用了surfaceDestroyed方法;然后再切回程序;Activity调用的顺序是onRestart->onStart->onResume;SurfaceView调用了surfaceCreated->surfaceChanged方法;
  2.而对于锁屏,其执行流程则是:
 Activity只调用onPause方法;解锁后Activity调用onResume方法;SurfaceView中surfaceholder.callback的所有方法都没有执行;
  3.推测是锁屏下系统并没有改变surfaceview的可见性,于是尝试在onPause和onResume时通过手动设置surfaceview的visibile属性。

-- Android相机开发的相关知识、流程,以及容易遇到的坑,
Android相机开发那些坑- http://blog.csdn.net/love_techlive/article/details/51331183
Multimedia框架Camera框架初识及自定义相机案例-- http://blog.csdn.net/hejjunlin/article/details/52738492
Multimedia框架Camera框架之Camera2补充- http://blog.csdn.net/hejjunlin/article/details/52751055
优美的Android自定义相机模块- http://download.csdn.net/download/gao_chun/9084853 
自定义相机模块-https://github.com/xplodwild/android_packages_apps_Focal 
打开前置摄像头并且实时获取数据- https://github.com/sadaharusong/FrontCamera/
TextureView和SurfaceTexture预览Camera拍照demo- http://blog.csdn.net/yanzi1225627/article/details/33313707
PlayCamera,TextureView预览Camera 拍照完整demo- http://download.csdn.net/detail/yanzi1225627/7540903
Android Multimedia框架总结案例,包含MediaPlayer,Camera等- https://github.com/hejunlin2013/MultiMediaSample

Android-Camera开发- http://blog.csdn.net/oShunz/article/category/5952777

> 视频处理如模糊效果、水印等
 Android 也有 GPUImage 这个库的移植,叫做 android-gpuimage。同时,Google 官方开源了一个伟大的库,覆盖了 Android 上面很多多媒体和图形图像相关的处理。各种需求如美颜、水印、连麦互动等,如美颜、视频水印、滤镜、连麦等。如打上时间戳或者公司 Logo 的水印,祛斑美颜和声音混淆等处理。
 常见的滤镜效果GPUImage 地址:https://github.com/BradLarson/GPUImage。
 除了 iOS 端之外,Android 也有 GPUImage 这个库的移植:https://github.com/CyberAgent/android-gpuimage。
 同时,Google 官方也开源了一个伟大的库,覆盖了 Android 上面很多多媒体和图形图像相关的处理:https://github.com/google/grafika。

Android中OpenGL滤镜和RenderScript图片处理- https://www.jianshu.com/p/66d0fcb902ab
Android中滤镜使用OpenGL和RenderScript处理图片- https://github.com/liweiping1314521/RiemannCamera/

> 相机滤镜
  美图秀秀,Instagram,aillias等优秀相机APP的效果。
  拍照时的实时滤镜(onPreviewFrame Android )和静态滤镜。Android平台的滤镜:相机滤镜功能,图片美化滤镜功能,社交分享滤镜功能。lomo滤镜。HSL色彩模式是工业界的一种颜色标准,是通过对色调(H)、饱和度(S)、亮度(L)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,HSL即是代表色调,饱和度,亮度三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。

  短视频的特效处理,每秒钟要处理几十张甚至更多的视频画面,所以简单的 C 语言处理算法并不能满足性能上的要求,我们需要使用手机的硬件加速能力,目前除了常见的 OpenGL 等 API 之外,还有如 Vulkan, DirectX, Metal 等可选方案。就目前而言,OpenGL 在各平台上通用性最好。

-- OpenGL ES 2.0来实现滤镜,RenderScript实现滤镜
 Android支持三种高性能运算的方式:RenderScript, OpenGL ES,JNI (with ARM NEON)。多实时滤镜的实现确实是一项对硬件性能和软件编写都具有很高要求的任务。使用opencv,简单实现人像优化功能:美白、肤色、祛斑和磨皮。GLES20,openGL ES实现人像优化。

  目前Android平台优质的预览数据实时处理开源代码不多,例如android-gpuimage,采用将YUV数据在NDK层转化为RGB数据,由OpenGL渲染到屏幕中,滤镜算法由Shader实现;其他方面,经过研究,目前主要有以下5种思路实现:
 1.不转换,直接由OpenGL绘制,采用Shader实现图像处理(因处理算法和渲染图片大部分采用RGB格式,此方案暂不考虑,仅提出可能性);
 2.通过C/C++实现YUV->RGB和图像处理,合成Bitmap,由CPU绘制在Canvas上;
 3.通过C/C++实现YUV->RGB和图像处理,在NDK层直接绘制在SurfaceView上;
 4.通过C/C++实现YUV->RGB,采用Shader实现图像处理,采用OpenGL绘制(android-gpuimage);
 5.通过Shader实现YUV->RGB和图像处理,采用OpenGL绘制。(最终采用方案)

  滤镜的开发主要是写片段着色器,从而实现各种滤镜效果。 即通过在C++层实现YUV-RGB转换,通过OpenGL绘制,通过片段着色器运行Shader脚本实现图像处理,虽然将滤镜的一些处理交给GPU来执行,极大的减少了速度,但YUV-RGB过程却拖了后腿。而Camera的帧数据却只能为NV21或者YV21的,不在OpenGLES贴图数据格式的支持范围。虽然我们可以将NV21、YV12的数据转换成RGBA的。

Android的视频编辑器,包括了视频录制、剪切、增加bgm、美白、加滤镜、加水印等多种功能- https://github.com/qqchenjian318/VideoEditor-For-Android

A prototype of camer live filter- https://github.com/fortdam/t_rtf_camera
ANDROID 高性能图形处理 之RenderScript- http://tangzm.com/blog/?p=18
滤镜相机MagicCamera- https://github.com/a483210/MagicCamera-ImageReader 
40余种实时滤镜相机,可拍照、录像、图片修改- https://github.com/wuhaoyu1990/MagicCamera
google MagicCamera采用的是录制方案来自于grafika- https://github.com/google/grafika
Android gpuimage的预览数据实时处理- https://github.com/CyberAgent/android-gpuimage
Android-Camera开发- http://blog.csdn.net/oShunz/article/category/5952777
Android平台Camera实时滤镜实现方法探讨(十一)--实时美颜滤镜- http://blog.csdn.net/oshunz/article/details/50536031
Android+JNI+OpenGL开发自己的美图秀秀- http://blog.csdn.net/oshunz/article/details/50537631
Android系统将内置滤镜功能- http://blog.csdn.net/real_myth/article/details/50925986
Android平台Camera实时滤镜实现方法探讨(一)--JNI操作Bitmap- http://blog.csdn.net/oshunz/article/details/49862273
android Camera 中添加一种场景模式- http://blog.csdn.net/fulinwsuafcie/article/details/8833652

-- 人脸识别 OpenFace,opencv人像
https://cmusatyalab.github.io/openface/
http://blog.dlib.net/2014/02/dlib-186-released-make-your-own-object.html
http://docs.opencv.org/trunk/d7/d8b/tutorial_py_face_detection.html
http://ydwen.github.io/papers/WenECCV16.pdf
OpenCV处理图片能力 - http://blog.csdn.net/q4878802/article/category/6081078
OpenCV+JavaCV实现人脸识别- http://blog.csdn.net/q4878802/article/details/52488447
Android使用OpenCV实现「人脸检测」和「人脸识别」- http://blog.csdn.net/q4878802/article/details/51841793
opencv实现人像优化- http://download.csdn.net/detail/u011630458/8754741

你可能感兴趣的:(Android,图像处理)