Skip to main content

Camera_Sensor 通用使用手册

1 摄像头配置方法

配置camera sensor (x2000_darwin gc2053为例子)

选择x2000_darwin的config文件, 进行配置

2023-03-23_14-29

进入模块化驱动

2

进入外设配置

3

选择camera设备列表,并且进入配置4

选择sensor gc2053并进入配置

5

可通过[单双模组选择]选择摄像头个数,若选择单模组则默认使用sensor0

6

12

进入sensor配置,配置好对应的引脚

13

紧接着回到模块化驱动,选择x2000驱动列表

7

进入camera驱动(vic 控制器)

8

可选择数据通过isp和数据不通过isp

9如下图所示,根据实际需要进行选择

10

11

若选择通过ISP模块,则需要勾选上libisp

14

2 摄像头使用方法

2.1 摄像头不经过ISP

(按照上述方法配置好摄像头,选择不通过isp模块)

特别注意:

在x2000系列板级上,如果选择则不通过ISP模块,camera节点为vic0(单摄) vic0 vic1(双摄)

双摄为两个节点即可分开控制,相当于两个独立的设备

Camera shell 命令:通过该命令操作camere进行工作,具体如下

cmd_camera   power_on   device_path
功能: 使能 camera 设备 , 上电
参数:无
Example:
cmd_camera power_on dev/vic0
cmd_camera power_on dev/vic1
cmd_camera  power_off   device_path
功能: 关闭 camera 设备 , 掉电
参数:无
Example:
cmd_camera power_off dev/vic0
cmd_camera power_off dev/vic1
cmd_camera   stream_on   device_path
功能: 开始 camera 图像录制
参数:无
Example:
cmd_camera stream_on /dev/vic0
cmd_camera   stream off   device_path
功能: 结束 camera 图像录制
参数:无
Example:
cmd_camera stream_off /dev/vic0
cmd_camera   info   device_path
功能: 获取 camera 设备信息
参数:无
Example:
cmd_camera info /dev/vic0
cmd_camera    get_frame    device_path
功能: 获取一帧的数据到到标准输出
参数:无
Example:
cmd_camera get_frame /dev/vic0
cmd_camera    drop_all_frames    device_path
功能: 丢弃已录制的图像数据帧
参数:无
Example:
cmd_camera drop_all_frames /dev/vic0

使用流程:

cmd_camera power_on dev/vic0 //使能设备

cmd_camera stream_on /dev/vic0 //打开图像录制

cmd_camera get_frame /dev/vic0 > /tmp/frame //获取图片并保存

如果想在电脑上查看图片,可以使用adb命令将图片拷贝到电脑,再用专用工具查看

adb pull /tmp/frame /tmp/picture //将板子里/tmp/frame里的图片拷贝到电脑/tmp/picture

注意在对应sensor手册查看sensor信息,图片长和高,图片格式

18

17

使用 7yuv 工具将保存到电脑上的图片打开,并选择图片格式与图片分辨率,出图效果如下:

20

16

当使用 cmd_camera_nv12_preview 命令时,则可在屏幕上显示摄像头所拍摄的照片

cmd_camera_nv12_preview     device_path
功能: 使用屏幕预览 camera 录制的图像( nv12 格式 )
参数: 无
Example :
cmd_camera_nv12_preview /dev/vic0

2.2 摄像头经过ISP

(按照上述方法配置好摄像头,选择通过isp模块)

特别注意:

在x2000系列板级上,如果选择则通过ISP模块,camera节点为mscaler0(单摄) mscaler0 mscaler1(双摄)

Camera shell 命令:通过该命令操作camere通过ISP工作,具体如下

cmd_isp   init   device_path   [width=value] [height=value] [frame_nums] [format]
功能: 初始化摄像头为你想要的模式
Example:
cmd_isp init /dev/mscaler0-ch0
cmd_isp init /dev/mscaler0-ch0 width=640 height=480 frame_nums=3 format=NV12

cmd_isp   power_on   device_path
功能: 使能 camera 设备 , 上电
Example:
cmd_isp power_on /dev/mscaler0-ch0
cmd_isp   power_off   device_path
功能: 关闭 camera 设备 , 掉电
Example:
cmd_isp power_off /dev/mscaler0-ch0
cmd_isp   stream_on    device_path
功能: 开始 camera 图像录制
Example:
cmd_isp stream_on /dev/mscaler0-ch0
cmd_isp   stream_off    device_path
功能: 结束 camera 图像录制
Example:
cmd_isp stream_off /dev/mscaler0-ch0
cmd_isp   info    device_path
功能: 获取 camera 设备信息
Example:
cmd_isp info /dev/mscaler0-ch0
cmd_isp   get_frame   device_path
功能: 获取一帧的数据到到标准输出
Example:
cmd_isp get_frame /dev/mscaler0-ch0
cmd_isp   drop_all_frames    device_path
功能: 丢弃已录制的图像数据帧
Example:
cmd_isp drop_all_frames /dev/mscaler0-ch0
cmd_isp   deinit   device_path
功能: 取消初始化
Example:
cmd_isp deinit /dev/mscaler0-ch0

使用流程:

cmd_isp init /dev/mscaler0-ch0 width=640 height=480 frame_nums=3 format=NV12

初始化isp设备 width height 为图像长和高 frame_nums 为mscaler 缓存帧个数

format 为设备支持格式  NV12 NV21 YV12 JZ12 GREY (仅支持这五种)

cmd_isp power_on /dev/mscaler0-ch0      使能camera设备

cmd_isp stream_on /dev/mscaler0-ch0 打开图像录制

cmd_isp get_frame /dev/mscaler0-ch0 > /tmp/frame 获取图片并保存

当使用demo_isp命令时,将自动截图到 /tmp/frame.nv12

demo_isp  device_path
功能: 自动截图并保存
Example:
demo_isp /dev/mscaler0-ch0

当使用demo_isp_nv12_preview命令时,则可在屏幕上显示摄像头所拍摄的照片,还可延迟拍摄

demo_isp_nv12_preview device_path   [timeout]
功能: 自动截图并保存
Example:
demo_isp_nv12_preview /dev/mscaler0-ch0
demo_isp_nv12_preview /dev/mscaler0-ch0 100

如果想在电脑上查看图片,可以使用adb命令将图片拷贝到电脑,再用专用工具查看

adb pull /tmp/frame /tmp/picture //将板子里/tmp/frame里的图片拷贝到电脑/tmp/picture

根据自己设置的图片尺寸与图片格式信息,例如:

​ width=640 height=480 frame_nums=3 format=NV12

使用 7yuv 工具将保存到电脑上的图片打开,并选择图片格式与图片分辨率,出图效果如下:

15

3 摄像头接口剖析

3.1 摄像头经过ISP

(具体参考libisp下的isp.c)

接口结构体讲解

摄像头信息结构体

struct camera_info {
char name[16]; //摄像头名称
unsigned int width; //每行像素数
unsigned int height; //行数
unsigned int frame_period_us; //camera 每帧时长,单位微秒
camera_data_fmt data_fmt; //camera 帧数据格式

unsigned int line_length; //一行的长度,单位字节
unsigned int frame_size; //一帧数据经过对齐之后的大小
unsigned int frame_nums; //帧缓冲总数
unsigned long phys_mem; // 帧缓冲的物理基地址
void *mapped_mem; //mmap 后的帧缓冲基地址
unsigned int align_size; //帧对齐大小
};
摄像头出图属性结构体

struct frame_image_format {
unsigned int width; //ISP MScaler 输出分宽
unsigned int height; //ISP MScaler 输出分高
int pixel_format; //ISP MScaler 输出格式

unsigned int frame_size; //ISP MScaler 帧大小
struct channel_scaler scaler; //ISP MScaler 缩放属性
struct channel_crop crop; //ISP MScaler 裁剪属性
int frame_nums; //ISP MScaler 缓存个数
unsigned char frame_rate_ratio; //帧率控制: 0% ~ 100%, 精度 10%
};

其中缩放与裁剪属性结构体

struct channel_crop {     //裁剪属性
int enable;
unsigned int top;
unsigned int left;
unsigned int width;
unsigned int height;
};

struct channel_scaler { //缩放属性
int enable;
unsigned int width;
unsigned int height;
};

接口函数讲解

int isp_open(const char* device_path);
功能:获得camera设备句柄
参数:
device_path 设备节点
返回值:
成功返回设备句柄,失败返回-1
int isp_mmap(int fd, struct camera_info *info);
功能:获得输出camera信息,映射地址等
参数:
fd camera设备句柄,isp_open()函数获得
info camera的信息,isp_open()函数初始化
返回值:
成功返回0,失败返回负数
int isp_close(int fd, struct camera_info *info);
功能:关闭camera设备句柄
参数:
fd camera设备句柄,isp_open()函数获得
info camera的信息,isp_open()函数初始化
返回值:
成功返回0,失败返回-1
int isp_power_on(int fd);
功能:使能camera设备,上电
参数:
fd camera设备句柄,isp_open()函数获得
返回值:
成功返回0,失败返回负数
int isp_power_off(int fd);
功能:关闭camera设备,掉电
参数:
fd camera设备句柄,isp_open()函数获得
返回值:
成功返回0,失败返回负数
int isp_stream_on(int fd);
功能:开始camera图像录制
参数:
fd camera设备句柄,isp_open()函数获得
返回值:
成功返回0,失败返回负数
int isp_stream_off(int fd);
功能:结束camera图像录制
参数:
fd camera设备句柄,isp_open()函数获得
返回值:
成功返回0,失败返回负数
void *isp_wait_frame(int fd);
功能:获取一帧录制的图像数据(未获取有效数据继续等待3s)
参数:
fd camera设备句柄,isp_open()函数获得
返回值:
成功返回图像缓冲区指针,失败返回NULL
void *isp_get_frame(int fd);
功能:获取一帧录制的图像数据(不等待)
参数:
fd camera设备句柄,isp_open()函数获得
返回值:
成功返回图像缓冲区指针,失败返回NULL
int isp_put_frame(int fd, void *mem);
功能:释放一帧图像缓冲区
参数:
fd camera设备句柄,isp_open()函数获得
mem 缓冲区指针,isp_wait_frame()函数获得
返回值:
成功返回0,失败返回负数
int isp_drop_frames(int fd, unsigned int frames);
功能:丢弃已录制的图像数据帧
参数:
fd camera设备句柄,isp_open()函数获得
frames 需要丢弃的帧数
返回值:
成功返回帧数,失败返回负数
int isp_get_info(int fd, struct camera_info *info);
功能:获得输出camera信息,映射地址等
参数:
fd camera设备句柄,isp_open()函数获得
info 用于存放camera的信息,不能为NULL
返回值:
成功返回0,失败返回负数
int isp_get_sensor_info(int fd, struct camera_info *info);
功能:获得输出camera未经过ISP的原始sensor信息等
参数:
fd camera设备句柄,isp_open()函数获得
info 用于存放camera的信息,不能为NULL
返回值:
成功返回0,失败返回负数

3.2 摄像头不经过ISP

(具体参考libhardware2下的camera.c)

接口结构体讲解

摄像头信息结构体

struct camera_info {
char name[16]; //摄像头名称
unsigned int width; //每行像素数
unsigned int height; //行数
unsigned int frame_period_us; //camera 每帧时长,单位微秒
camera_data_fmt data_fmt; //camera 帧数据格式

unsigned int line_length; //一行的长度,单位字节
unsigned int frame_size; //一帧数据经过对齐之后的大小
unsigned int frame_nums; //帧缓冲总数
unsigned long phys_mem; // 帧缓冲的物理基地址
void *mapped_mem; //mmap 后的帧缓冲基地址
unsigned int align_size; //帧对齐大小
};

接口函数讲解

int camera_open(struct camera_info *info, const char* device_path);
功能:获得camera设备句柄
参数:
info 用于存放camera的信息,不能为NULL
device_path 设备节点
返回值:
成功返回设备句柄,失败返回-1
int camera_close(int fd, struct camera_info *info);
功能:关闭camera设备句柄
参数:
fd camera设备句柄,camera_open()函数获得
info camera的信息,camera_open()函数初始化
返回值:
成功返回0,失败返回-1
int camera_power_on(int fd);
功能:使能camera设备,上电
参数:
fd camera设备句柄,camera_open()函数获得
返回值:
成功返回0,失败返回负数
int camera_power_off(int fd);
功能:关闭camera设备,掉电
参数:
fd camera设备句柄,camera_open()函数获得
返回值:
成功返回0,失败返回负数
int camera_stream_on(int fd);
功能:开始camera图像录制
参数:
fd camera设备句柄,camera_open()函数获得
返回值:
成功返回0,失败返回负数
int camera_stream_off(int fd);
功能:结束camera图像录制
参数:
fd camera设备句柄,camera_open()函数获得
返回值:
成功返回0,失败返回负数
void *camera_wait_frame(int fd);
功能:获取一帧录制的图像数据
参数:
fd camera设备句柄,camera_open()函数获得
返回值:
成功返回图像缓冲区指针,失败返回NULL
int camera_put_frame(int fd, void *mem);
功能:释放一帧图像缓冲区
参数:
fd camera设备句柄,camera_open()函数获得
mem 缓冲区指针,camera_wait_frame()函数获得
返回值:
成功返回0,失败返回负数
int camera_drop_frames(int fd, unsigned int frames);
功能:丢弃已录制的图像数据帧
参数:
fd camera设备句柄,camera_open()函数获得
frames 需要丢弃的帧数
返回值:
成功返回帧数,失败返回负数