V4L2摄像头测试(一)

  1. 利用VIDIOC_G_CTRL得到一些设置:
    一些具体的设置,如曝光模式(Exposure Type),曝光值(Exposure),增益(Gain),白平衡(WHITE_BALANCE),亮度(BRIGHTNESS),饱和度(SATURATION),对比度(CONTRAST)等信息。可以通过VIDIOC_G_CTRL得到当前值。
    用法:APP 填写结构体中的id. 通过调用VIDIOC_G_CTRL,driver 会填写结构体中value项。
    struct v4l2_control ctrl;
    struct v4l2_control
    {
     __u32 id;
     __s32 value;
    };
    以曝光模式,曝光,和增益为例; 
    曝光模式:
    struct v4l2_control ctrl;
    ctrl.id = V4L2_CID_EXPOSURE_AUTO;
    ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);
    ctrl.value 则由Driver填写。告知当前曝光模式。
    有以下几个选择:
    enum  v4l2_exposure_auto_type {
    V4L2_EXPOSURE_AUTO = 0,
    V4L2_EXPOSURE_MANUAL = 1,
    V4L2_EXPOSURE_SHUTTER_PRIORITY = 2,
    V4L2_EXPOSURE_APERTURE_PRIORITY = 3
    };
    exposure_auto (menu)   : min=0 max=3 default=3 value=3
    V4L2_CID_EXPOSURE_AUTO  enum v4l2_exposure_auto_type  
    Enables automatic adjustments of the exposure time and/or iris aperture. The effect of manual changes of the exposure time or iris aperture while these features are enabled is undefined, drivers should ignore such requests. Possible values are:
      V4L2_EXPOSURE_AUTO  Automatic exposure time, automatic iris aperture.
    V4L2_EXPOSURE_MANUAL  Manual exposure time, manual iris.
    V4L2_EXPOSURE_SHUTTER_PRIORITY  Manual exposure time, auto iris.
    V4L2_EXPOSURE_APERTURE_PRIORITY  Auto exposure time, manual iris.

注意: Sam测试发现,在Linux下,V4L2_EXPOSURE_ATUO并不被Firmware认可,要设置自动曝光,需要设置为:V4L2_EXPOSURE_APERTURE_PRIORITY
曝光:
struct v4l2_control ctrl;
ctrl.id = V4L2_CID_EXPOSURE_ABSOLUTE;
ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);
同样,driver填写ctrl.value. 内容为曝光值。
增益:
struct v4l2_control ctrl;
ctrl.id = V4L2_CID_GAIN;
ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);
同样,driver填写ctrl.value. 内容为增益。
6. 利用VIDIOC_QUERYCTRL 得到设置具体信息:
在很多情况下,我们并不知道如何设置一些信息,例如,曝光应该设置为多少?Driver能够接受的范围是多少?最大,最小值是多少?步长是多少?缺省值为多少?
可以通过VIDIOC_QUERYCTRL得到。
咱们还是以增益为例:
struct v4l2_queryctrl  Setting;
Setting.id = V4L2_CID_GAIN;
ret = ioctl(Handle, VIDIOC_QUERYCTRL, &Setting);
Driver就会填写结构体中所有信息。
struct v4l2_queryctrl
{
 __u32 id;  //用户设置。指定查找的是哪个ID。
 enum v4l2_ctrl_type type;
 __u8 name[32];  //ID对应的名字。
 __s32 minimum;
 __s32 maximum;
 __s32 step;   //步长
 __s32 default_value;
 __u32 flags;
 __u32 reserved[2];
};
这样,就知道设置什么值是合法的了。那么,下一步就是设置了。
7. 利用VIDIOC_S_CTRL来设置:
很简单,设置id和value.调用ioctl就好。
还是以增益为例:
struct v4l2_control ctrl;
ctrl.id = V4L2_CID_GAIN;
ctrl.value = Gain;
ret = ioctl(Handle, VIDIOC_S_CTRL, &ctrl);

struct v4l2_control { __u32 id; __s32 value; };
注释: 曝光模式:
struct v4l2_control ctrl;
ctrl.id = V4L2_CID_EXPOSURE_AUTO;
ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);
ctrl.value 则由Driver填写。告知当前曝光模式。
有以下几个选择:
enum v4l2_exposure_auto_type
{
V4L2_EXPOSURE_AUTO = 0,
V4L2_EXPOSURE_MANUAL = 1,
V4L2_EXPOSURE_SHUTTER_PRIORITY = 2,
V4L2_EXPOSURE_APERTURE_PRIORITY = 3 };
曝光:
struct v4l2_control ctrl;
ctrl.id = V4L2_CID_EXPOSURE_ABSOLUTE;
ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);
同样,driver填写ctrl.value. 内容为曝光值。
增益:
struct v4l2_control ctrl;
ctrl.id = V4L2_CID_GAIN;
ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);
同样,driver填写ctrl.value. 内容为增益。

第二部分:
5. 利用VIDIOC_G_CTRL得到一些设置:
一些具体的设置,如曝光模式(Exposure Type),曝光值(Exposure),增益(Gain),白平衡(WHITE_BALANCE),亮度(BRIGHTNESS),饱和度(SATURATION),对比度(CONTRAST)等信息。可以通过VIDIOC_G_CTRL得到当前值。
用法:APP 填写结构体中的id. 通过调用VIDIOC_G_CTRL,driver 会填写结构体中value项。
struct v4l2_control ctrl;
struct v4l2_control
{
 __u32 id;
 __s32 value;
};
以曝光模式,曝光,和增益为例; 
曝光模式:
struct v4l2_control ctrl;
ctrl.id = V4L2_CID_EXPOSURE_AUTO;
ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);
ctrl.value 则由Driver填写。告知当前曝光模式。
有以下几个选择:
enum  v4l2_exposure_auto_type {
V4L2_EXPOSURE_AUTO = 0,
V4L2_EXPOSURE_MANUAL = 1,
V4L2_EXPOSURE_SHUTTER_PRIORITY = 2,
V4L2_EXPOSURE_APERTURE_PRIORITY = 3
};
曝光:
struct v4l2_control ctrl;
ctrl.id = V4L2_CID_EXPOSURE_ABSOLUTE;
ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);
同样,driver填写ctrl.value. 内容为曝光值。
增益:
struct v4l2_control ctrl;
ctrl.id = V4L2_CID_GAIN;
ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);
同样,driver填写ctrl.value. 内容为增益。
6. 利用VIDIOC_QUERYCTRL 得到设置具体信息:
在很多情况下,我们并不知道如何设置一些信息,例如,曝光应该设置为多少?Driver能够接受的范围是多少?最大,最小值是多少?步长是多少?缺省值为多少?
可以通过VIDIOC_QUERYCTRL得到。
咱们还是以增益为例:
struct v4l2_queryctrl  Setting;
Setting.id = V4L2_CID_GAIN;
ret = ioctl(Handle, VIDIOC_QUERYCTRL, &Setting);
Driver就会填写结构体中所有信息。
struct v4l2_queryctrl
{
 __u32 id;  //用户设置。指定查找的是哪个ID。
 enum v4l2_ctrl_type type;
 __u8 name[32];  //ID对应的名字。
 __s32 minimum;
 __s32 maximum;
 __s32 step;   //步长
 __s32 default_value;
 __u32 flags;
 __u32 reserved[2];
};
这样,就知道设置什么值是合法的了。那么,下一步就是设置了。
7. 利用VIDIOC_S_CTRL来设置:
很简单,设置id和value.调用ioctl就好。
还是以增益为例:
struct v4l2_control ctrl;
ctrl.id = V4L2_CID_GAIN;
ctrl.value = Gain;
ret = ioctl(Handle, VIDIOC_S_CTRL, &ctrl);
有时候,硬件设置很奇怪,可以设置某个信息,却无法得到如何设置的信息。例如:HD-500可以设置增益。却无法得到该如何设置。
8. 利用扩展Ctrl设置:
焦距(FOUCE);
注1:enum v4l2_field field; 详解:
9.设定分辨率:
struct v4l2_control control;
memset(&control, 0, sizeof(control)); 
control.id = V4L2_CID_AUTO_WHITE_BALANCE; 
control.value = 1; 
if (ioctl(fd, VIDIOC_S_CTRL, &control) < 0) 

printf(“Couldn’t set auto white balance!\n”); 
//return -1; 
}
memset(&control, 0, sizeof(control)); 
control.id = V4L2_CID_EXPOSURE_AUTO; 
control.value = 1;
if (ioctl(fd, VIDIOC_S_CTRL, &control) < 0) 

printf(“Couldn’t set auto exposure!\n”); 
//return -1; 
}
memset(&control, 0, sizeof(control)); 
control.id = V4L2_CID_HFLIP; 
control.value = 1; 
if (ioctl(fd, VIDIOC_S_CTRL, &control) < 0) 

printf(“Couldn’t set h flip!\n”); 
//return -1; 

memset(&control, 0, sizeof(control)); 
control.id = V4L2_CID_VFLIP; 
control.value = 1; 
if (ioctl(fd, VIDIOC_S_CTRL, &control) < 0) 

printf(“Couldn’t set v flip!\n”); 
//return -1; 
}

1.得到和设置曝光模式。V4L2_CID_EXPOSURE_AUTO
2.得到和设置曝光档次。V4L2_CID_EXPOSURE

猜你喜欢

转载自blog.csdn.net/qq_40008325/article/details/86322387