-
cameratest12_grab_20161101_1440.tar.gz下载
资源介绍
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流程图)
- 上一篇: ALC892声卡MAC驱动
- 下一篇: 小米随身WIFI驱动.zip