一、开发背景
由于在项目中需要集成多个人脸识别SDK,然后这些SDK有些有自己的Camera API(但又不是特别独立),有的SDK甚至都没有像样的Camera API。所以我就自己写了一个通用的,用来抓取视频流的Camera1的代码封装。
二、特色
快速适配各类相机(物理旋转、镜像、各种角度旋转等)
控件大小自动适配
人脸位置映射
使用缓冲机制获取视频流
代码简单(一个Class)、引入方面,CameraPreview的完整代码在第五点
1.png
2.png
三、基本使用,炒鸡简单
1、一个 Layout文件
android:layout_width="match_parent"
android:layout_height="match_parent"
>
android:id="@+id/camera_preview"
android:layout_width="300dp"
android:layout_height="500dp"
/>
2、恢复和停止 (默认是前置摄像头 适配设备oneplus 6)
package com.lfork.cameraimagecollect.camera1
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import com.lfork.cameraimagecollect.R
import kotlinx.android.synthetic.main.activity_camera_texture.*
class CameraTextureActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_camera_texture)
}
override fun onResume() {
super.onResume()
camera_preview.resumeCamera()
}
override fun onStop() {
super.onStop()
camera_preview.releaseCamera()
}
}
3、相关的权限处理就需要自己完成了
四、进阶使用
1、设置预览回调帧 确保在resumeCamea()之前调用即可
val previewFrameCallBack = Camera.PreviewCallback { data, _ ->
Log.d("CameraTextureActivity", "preview camera byte data $data")
}
camera_preview.previewCallBack = previewFrameCallBack
2、针对特定的相机进行适配
val params = CameraPreview.Params()
params.cameraId = 0
params.isHorizontalMirrored = false
params.previewRotation = 90f
params.previewWidth = 640
params.previewHeight = 480
camera_preview.setupCameraParams(params)
3、人脸位置映射
/**
* 原始图片(传到SDK里面进行处理的图片)中的坐标到预览View坐标中的映射。应用场景举例:预览页面显示人脸框。
*
* @param rectF 原始图中的坐标
*/
fun mapFromOriginalRect(rectF: RectF, rawImgWeight: Int, rawImgHeight: Int)
五、引入:一个class,拷贝到项目中即可
package com.lfork.cameraimagecollect.camera
import android.content.Context
import android.graphics.Matrix
import android.graphics.RectF
import android.graphics.SurfaceTexture
import android.hardware.Camera
import android.os.Handler
import android.os.Looper
import android.support.annotation.AttrRes
import android.util.AttributeSet
import android.view.TextureView
import android.wid