V4L2攝像頭測試(一)
- 利用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;
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;
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