1、Camera成像原理介绍
Camera工作流程图
Camera的成像原理可以简单概括如下:
景物(SCENE)通过镜头(LENS)生成的光学图像投射到图像传感器(Sensor)表面上,然后转为电信号,经过A/D(模数转换)转换后变为数字图像信号,再送到数字信号处理芯片(DSP)中加工处理,再通过IO接口传输到CPU中处理,通过DISPLAY就可以看到图像了。
电荷耦合器件(CCD)或
互补金属氧化物半导体(CMOS)接收光学镜头传递来的影像,经模/数转换器(A/D)转换成数字信号,经过编码后存储。
流程如下:
1)、CCD/CMOS将被摄体的光信号转变为电信号—电子图像(模拟信号)
2)、由模/数转换器(ADC)芯片来将模拟信号转化为数字信号
3)、数字信号形成后,由DSP或编码库对信号进行压缩并转化为特定的图像文件格式储存
数码相机的光学镜头与传统相机相同,将影像聚到感光器件上,即(光)电荷耦合器件(CCD) 。CCD替代了传统相机中的感光胶片的位置,其功能是将光信号转换成电信号,与电视摄像相同。
CCD是半导体器件,是数码相机的核心,其内含器件的单元数量决定了数码相机的成像质量——像素,单元越多,即像素数高,成像质量越好,通常情况下像素的高低代表了数码相机的档次和技术指标。
2、Android Camera框架
Android的Camera子系统提供一个拍照和录制视频的框架。
它将Camera的上层应用与Application Framework、用户库串接起来,而正是这个用户库来与Camera的硬件层通信,从而实现操作camera硬件。
--------------------------------------------------------------------------------------------
Camera 预览功能函数调用流程:
-----------------------------------------------------------------------------------------------、
Camera 拍照功能函数调用流程:
3.Camera HAL层部分
代码存放目录:hardware
k29camera
编译:
[cpp] view
plaincopy
-
LOCAL_PATH:= $(call my-dir)
-
include $(CLEAR_VARS)
-
LOCAL_SRC_FILES:=
-
CameraHal_Module.cpp
-
CameraHal.cpp
-
CameraHal_Utils.cpp
-
MessageQueue.cpp
-
CameraHal_Mem.cpp
-
...................
-
ifeq ($(strip $(TARGET_BOARD_HARDWARE)),rk30board)
-
LOCAL_MODULE:= camera.rk30board
为了实现一个具体功能的Camera,在HAL层需要一个硬件相关的Camera库(例如通过调用video for linux驱动程序和Jpeg编码程序实现或者直接用各个chip厂商实现的私有库来实现,比如Qualcomm实现的libcamera.so和libqcamera.so),此处为camera.rk30board.so实现CameraHardwareInterface规定的接口,来调用相关的库,驱动相关的driver,实现对camera硬件的操作。这个库将被Camera的服务库libcameraservice.so调用。
3.1CameraHal_Module.cpp主要是Camera HAL对上层提供的接口,和实际设备无关,上层的本地库都直接调用这个文件里面提供的接口。
[cpp] view
plaincopy
-
static int camera_device_open(const hw_module_t* module, const char* name,
-
hw_device_t** device);
-
static int camera_device_close(hw_device_t* device);
-
static int camera_get_number_of_cameras(void);
-
static int camera_get_camera_info(int camera_id, struct camera_info *info);
-
-
-
static struct hw_module_methods_t camera_module_methods = {
-
open: camera_device_open
-
};
-
-
-
camera_module_t HAL_MODULE_INFO_SYM = {
-
common: {
-
tag: HARDWARE_MODULE_TAG,
-
version_major: ((CONFIG_CAMERAHAL_VERSION&0xff00)>>8),
-
version_minor: CONFIG_CAMERAHAL_VERSION&0xff,
-
id: CAMERA_HARDWARE_MODULE_ID,
-
name: CAMERA_MODULE_NAME,
-
author: "RockChip",
-
methods: &camera_module_methods,
-
dso: NULL,
-
reserved: {0},
-
},
-
get_number_of_cameras: camera_get_number_of_cameras,
-
get_camera_info: camera_get_camera_info,
-
};
//CAMERA_DEVICE_NAME "/dev/video" 以下都是通过读取节点信息来获取摄像头的数目及摄像头设备信息
[cpp] view
plaincopy
-
int camera_device_close(hw_device_t* device)
-
{
-
int ret = 0;
-
rk_camera_device_t* rk_dev = NULL;
-
-
LOGD("%s", __FUNCTION__);
-
-
android::Mutex::Autolock lock(gCameraHalDeviceLock);
-
-
if (!device) {
-
ret = -EINVAL;
-
goto done;
-
}
-
-
rk_dev = (rk_camera_device_t*) device;
-
-
if (rk_dev) {
-
if (gCameraHals[rk_dev->cameraid]) {
-
delete gCameraHals[rk_dev->cameraid];
-
gCameraHals[rk_dev->cameraid] = NULL;
-
gCamerasOpen--;
-
}
-
-
if (rk_dev->base.ops) {
-
free(rk_dev->base.ops);
-
}
-
free(rk_dev);
-
}
-
done:
-
-
return ret;
-
}
-
-
-
-
-
-
-
-
-
-
-
-
int camera_device_open(const hw_module_t* module, const char* name,
-
hw_device_t** device)
-
{
-
int rv = 0;
-
int cameraid;
-
rk_camera_device_t* camera_device = NULL;
-
camera_device_ops_t* camera_ops = NULL;
-
android::CameraHal* camera = NULL;
-
-
android::Mutex::Autolock lock(gCameraHalDeviceLock);
-
-
LOGI("camera_device open");
-
-
if (name != NULL) {
-
cameraid = atoi(name);
-
-
if(cameraid > gCamerasNumber) {
-
LOGE("camera service provided cameraid out of bounds, "
-
"cameraid = %d, num supported = %d",
-
cameraid, gCamerasNumber);
-
rv = -EINVAL;
-
goto fail;
-
}
-
-
if(gCamerasOpen >= CAMERAS_SUPPORTED_SIMUL_MAX) {
-
LOGE("maximum number(%d) of cameras already open",gCamerasOpen);
-
rv = -ENOMEM;
-