查看: 2307|回复: 0

[评测分享] 【米尔FZ3深度学习计算卡】(三)V4L2采集视频流识别

[复制链接]
  • TA的每日心情
    慵懒
    2023-6-28 14:17
  • 签到天数: 299 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2020-12-13 21:57:39 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 day_day 于 2020-12-13 21:59 编辑

    V4L2 是 linux 下的通用视频框架,板子上的opencv没有适配v4l2,因此视频采集需要直接操作V4L2。

    (一)V4L2采集
    V4L2是作为通用视频框架,操作和 linux 各类设备驱动有点像,都是打开/dev下的设备文件,通过ioctl控制。

    1-打开设备文件


    1.     int fd=open("/dev/video2",O_RDWR);// 打开设备
    2.         init_uvc(fd);
    复制代码

    2-查询设备属性
    1.     ioctl(fd,VIDIOC_QUERYCAP,&cap);
    2.     printf("DriverName\t%s\r\nCard Name\t%s\r\nBus info\t%s\r\nDriverVersion\t%u.%u.%u\r\n",
    3.            cap.driver,cap.card,cap.bus_info,(cap.version>>16)&0XFF,(cap.version>>8)&0XFF,(cap.version)&0xFF);
    复制代码


    3-帧格式-显示所有支持的格式

    1.     struct v4l2_fmtdesc fmtdesc;
    2.     unsigned int min = 0;

    3.     fmtdesc.index=0;
    4.     fmtdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
    5.     printf("Supportformat:\r\n");
    6.     while(ioctl(fd,VIDIOC_ENUM_FMT,&fmtdesc)!=-1)
    7.     {
    8.         printf("\t%d.%s\r\n",fmtdesc.index+1,fmtdesc.description);
    9.         fmtdesc.index++;
    10.     }
    复制代码

    4-显示当前帧的相关信息
    1.     struct v4l2_format fmt;
    2.     fmt.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;

    3.     fmt.fmt.pix.width       = 640;
    4.     fmt.fmt.pix.height      = 480;
    5.     fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
    6.     fmt.fmt.pix.field       = V4L2_FIELD_NONE;

    7.     ioctl(fd,VIDIOC_S_FMT,&fmt);
    8.     ioctl(fd,VIDIOC_G_FMT,&fmt);

    9.     printf("Currentdata format information:\r\n\twidth:%d\r\n\theight:%d\r\n", fmt.fmt.pix.width, fmt.fmt.pix.height);
    复制代码

    5-申请一个拥有四个缓冲帧的缓冲区
    1.     struct v4l2_requestbuffers req;
    2.     req.count=n_buffers;
    3.     req.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
    4.     req.memory=V4L2_MEMORY_MMAP;
    5.     ioctl(fd,VIDIOC_REQBUFS,&req);

    6.     buffers =(buffer*)calloc (req.count, sizeof (*buffers));
    7.     if (!buffers) {
    8.         fprintf (stderr,"Out of memory\n");
    9.         exit(EXIT_FAILURE);
    10.     }
    复制代码

    6-映射内存
    1.     for (unsigned int n_buffers = 0; n_buffers < req.count; ++n_buffers) {
    2.         struct v4l2_buffer buf;
    3.         memset(&buf,0,sizeof(buf));
    4.         buf.type =V4L2_BUF_TYPE_VIDEO_CAPTURE;
    5.         buf.memory =V4L2_MEMORY_MMAP;
    6.         buf.index =n_buffers;
    7.         // 查询序号为n_buffers 的缓冲区,得到其起始物理地址和大小
    8.         if (-1 == ioctl(fd, VIDIOC_QUERYBUF, &buf))
    9.             exit(-1);
    10.         buffers[n_buffers].length= buf.length;
    11.         // 映射内存
    12.         buffers[n_buffers].start=
    13.                 mmap (
    14.                     NULL,
    15.                     buf.length,
    16.                     PROT_READ | PROT_WRITE ,
    17.                     MAP_SHARED,
    18.                     fd,
    19.                     buf.m.offset);
    20.         if (MAP_FAILED== buffers[n_buffers].start)
    21.             exit(-1);
    22.     }
    复制代码

    7-把四个缓冲帧放入队列,并启动数据流
    1.     unsigned int i;
    2.     enum v4l2_buf_type type;
    3.     // 将缓冲帧放入队列
    4.     for (i = 0; i< n_buffers; ++i)
    5.     {
    6.         struct v4l2_buffer buf;
    7.         buf.type =V4L2_BUF_TYPE_VIDEO_CAPTURE;
    8.         buf.memory =V4L2_MEMORY_MMAP;
    9.         buf.index = i;
    10.         ioctl (fd,VIDIOC_QBUF, &buf);
    11.     }
    12.     type =V4L2_BUF_TYPE_VIDEO_CAPTURE;
    13.     ioctl (fd,VIDIOC_STREAMON, &type);
    复制代码

    8-把图像从缓冲区取出来
    1.     while(cvWaitKey(30)!='q'){
    2.         struct v4l2_buffer buf;
    3.         //    clear (buf);
    4.         buf.type =V4L2_BUF_TYPE_VIDEO_CAPTURE;
    5.         buf.memory =V4L2_MEMORY_MMAP;
    6.         // 从缓冲区取出一个缓冲帧
    7.         ioctl (fd,VIDIOC_DQBUF, &buf);

    8.         // 将取出的缓冲帧放回缓冲区
    9.         ioctl (fd, VIDIOC_QBUF,&buf);
    10.     }
    复制代码


    (二)加入识别 效果

    识别速度:
    深度截图_mate-terminal_20201212230747.png
    实际跑上视频流之后,速度更快一些。PC上的速度不到3帧秒,这里基本是有7、8帧秒。
    1.gif



    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-3-29 22:49 , Processed in 0.122194 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.