2015-03-25 66 views
1

我正在尝试调整摄像头的亮度。在设置亮度之前,我正在尝试检查亮度是否处于自动模式。我们可以通过检查易失性标志来实现,但是我正在运行内核版本2.6.32,它没有这个功能。所以,另一种选择是检查V4L2_CID_AUTOBRIGHTNESS,这是我正在做的,但它正在返回EINVAL。在v4l2中获取布尔值控件的值

我使用下面的代码来获取值:

struct v4l2_control control; 

control.id = V4L2_CID_BRIGHTNESS;  // This is working fine 
//control.id = V4L2_CID_AUTOBRIGHTNESS; // This is giving EINVAL in ioctl 


if (-1 == ioctl(camDesc, VIDIOC_G_CTRL, &control)) 
    cerr << "VIDIOC_G_CTRL" << " :: " << errno << endl ; 
else 
    cout << "Successfully got property. Value :: " << control.value << endl; 

可能V4L2_CID_AUTOBRIGHTNESS是一个布尔属性,这就是为什么它给EINVAL,但当时我无法找到任何其他方法由此我可以得到布尔属性的值。

回答

0

某些属性(用户控件)可以被禁用,所以如果我们直接使用v4l2_control更改那里的值,那么它可能会给出一些错误。

最好的办法是,通过检查相应的标志使用queryctrl然后设置实际值。

struct v4l2_queryctrl queryctrl; 
queryctrl.id = V4L2_CID_BRIGHTNESS; // V4L2_CID_AUTOBRIGHTNESS i.e. any user ctrl 

if (-1 == ioctl(camDesc, VIDIOC_QUERYCTRL, &queryctrl)) 
{ 
    if (errno != EINVAL) 
     exit(EXIT_FAILURE); 
    else 
    { 
     cerr << "ERROR :: Unable to set property (NOT SUPPORTED)\n"; 
     exit(EXIT_FAILURE); 
    } 
} 
else if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED) 
{ 
    cout << "ERROR :: Unable to set property (DISABLED).\n"; 
    exit(EXIT_FAILURE); 
} 
else 
{ 
    struct v4l2_control control; 
    control.id = queryctrl.id; 
    control.value = eValue;  // Any value 

    if (-1 == ioctl(camDesc, VIDIOC_S_CTRL, &control)) 
    exit(EXIT_FAILURE); 
    cout << "Successfully set property." << endl; 

} 
2

在V4L2中,IOCTL集合主要在实际传感器的一侧实现(或未实现)。这一个不是例外。因此,这里有两个潜在的问题:a)实际传感器的驱动程序没有实现特定的IOCTL,b)IOCTL只是设置一个属性,尽管我认为你仍然可以读取最后的设置值。

+0

感谢您的回复。你在(b)点提到,** IOCTL只是设置一个属性**,但你也可以使用IOCTL来获得一个属性。它受**请求**的价值支配。在我的情况下,如果您将通过** VIDIOC_G_CTRL **,那么您将获得该属性,并在** VIDIOC_S_CTRL **的情况下,您将获得该属性。 – techbull 2015-03-27 08:13:24

+0

是的,因为通常属性被缓存在内部结构中(对于某些驱动程序来说可能不是这样)。 – 0andriy 2015-03-27 14:48:59