1. 程式人生 > >V4L2攝像頭測試(一)

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