v4l2怎么设置曝光啊,

suporesky 2012-03-05 09:57:12
struct v4l2_control m_ctrl;
m_ctrl.id = V4L2_CID_BRIGHTNESS;
m_ctrl.value = 128;
ff = ioctl (m_vfd, VIDIOC_S_CTRL, &m_ctrl); //设置亮度
设置亮度参数可以,但是我不知道如何设置曝光时间,摄像头在directshow下的amcap下有相机控制曝光选项的,有做过类似的大侠指点下哈,
...全文
548 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
小小悟空 2013-03-15
  • 打赏
  • 举报
回复
我也想知道。。。请问你这个是在底层驱动中调吗?还是在pc中的应用程序里面调?
cameratest12_grab_20161101_1440.tar.gz API接口的文件 R:\wyb\ov5640_parrot_r16_tinav2.0\package\allwinner\cameratest\src\cameratest.c R:\wyb\ov5640_parrot_r16_tinav2.0\package\allwinner\cameratest\src\videodev2.h 5.CSI接口的摄像头,用文工提供的方法,可以看到图片,但是我们仍然调用不了。因为文工提供的方法是Camera Test,我们仍然希望你们能提供一个从CSI接口获取图像的API接口函数。 CSI摄像头API接口,支持设置图像参数,支持捕捉图像帧数据。 API摄像头设置参数: 图像长:1280,640,320 图像高:720,480,240 R:\wyb\ov5640_parrot_r16_tinav2.0\lichee\linux-3.4\drivers\media\video\sunxi-vfe\device\ov5640.c static struct regval_list sensor_720p_regs[] = { //1280*720 static struct regval_list sensor_vga_regs[] = { //VGA: 640*480 由于驱动中没有320*240这个分辨率,建议直接通过软件取VGA: 640*480(横竖各隔一个点取一个),或者请OV提供QVGA(320*240)的寄存器配置。 例子给出来的是:640*480,可以很方便地修改为1280*720(生成的YUV的体积请做相应的修改)。 YUV格式现在配置为V4L2_PIX_FMT_NV12,也可以配置为其他格式,请根据需要配置。 修改: R:\wyb\ov5640_parrot_r16_tinav2.0\package\allwinner\cameratest\src\cameratest.c static int setVideoParams(void) { …… width1 = 640; height1 = 480; pixelformat1 = V4L2_PIX_FMT_NV12; } 亮度 [0,100] 对比度 [0,100] 饱和度 [0,100] 增益 [0,100] 曝光度 [1,100] 白平衡 [1,100] 通道 1 3, 默认1(灰度) 这些需要OV的FAE提供修改哪些寄存器,现阶段已经确认使用默认设置。 图像格式 RGB YUV,默认RGB ov5640默认出来的是YUV格式(cameratest中使用的是NV12),RGB请自行查找相关算法转换。 RGB和YUV.pdf 我找到的一个参考文档。YUYV格式转RGB格式。 https://www.douban.com/note/76361504/ RGB和YUV(请注意:这个算法适用于:V4L2_PIX_FMT_YUYV) 2.2.抓取图像信息,返回图像的内存地址。 测试步骤: 执行cameratest的时候,输入小写字母g回车。 程序的简要流程: command_thread1线程检测到g(grab)之后,通过iFlagGrab变量告知camera_thread2线程,将摄像头的当前帧图像放入到数组arrayVGANV12中。 已知会存在的效率问题: memcpy会消耗CPU资源!!!!如果对实时性要求不是特别高,调用memcpy是可以接受的。 如果对实时性要求特别高,建议直接把算法嵌入到capture_frame函数的相对应的位置。 void command_thread1(void) { …… while(1) { while((ch=getchar()) != '\n') { …… else if('g'==ch) { iFlagGrab = 1; printf("thread1=%d\n", iFlagGrab); // while(2==iFlagGrab) while(iFlagGrab) { if(2==iFlagGrab) { char image_name[30]; memset(image_name, 0, sizeof(image_name)); sprintf(image_name, "%s/grab_nv12d%s", "/tmp", iCameraCounter++, ".yuv"); // ret = save_frame_to_file(image_name, (void*)(vir_sub_start), width1, height1, pixelformat1, 1); int ret = save_frame_to_file(image_name, arrayVGANV12, width1, height1, pixelformat1, 1); iFlagGrab = 0; printf("****wyb %s:%d/%s()! \n", __FILE__, __LINE__, __func__); } else { usleep(2000); } } } } …… } static int capture_frame() { …… if(1==iFlagGrab) { //memcpy(d,s,(strlen(s)+1)); //buffers[buf.index].phy_addr = buf.m.offset - 0x20000000; memcpy( arrayVGANV12, buffers[buf.index].start, 640*480*3/2); iFlagGrab = 2; printf("****wyb %s:%d/%s()! iFlagGrab=%d\n", __FILE__, __LINE__, __func__, iFlagGrab); printf("****wyb %s:%d/%s()! 0xx buf.index=%d\n", __FILE__, __LINE__, __func__, buffers[buf.index].start, buf.index); //if(ret == 0){ // buffers[buf.index].phy_addr = buf.m.offset - 0x20000000; // hv_dbg("index: %d buffers[buf.index].start = %p\n", buf.index, buffers[buf.index].start); // do_save_sub_image(buf.index); // //SAVE_IMAGE--; // iFlagCamera--; //} } …… } 更多: V4L2方面的参考资料: Linux视频驱动接口V4L2视频采集编程.pdf Linux下V4L2编程小结--吴老师.doc 基于Linux视频驱动接口V4L2视频采集-初步完工.vsd (VISIO流程图)

23,114

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧