激情综合丁香-激情综合六月-激情综合婷婷亚洲图片-激情综合图区-激情综合网五月

CSI攝像頭接口及在英創主板上的應用

 2017-10-19     作者:黃志超         
文章標簽:C/C++ESM6800

  目前,英創公司在低成本核心板ESM6800的基礎上,推出了支持攝像頭的版本ESM6800V,ESM6800V是在ESM6800H的基礎上,去掉了一路網口和6路擴展串口,增加了一路CSI(COMS Sensor Interface)信號接口。ESM6800V的其它系統及接口配置與ESM6800完全相同。CSI是一個標準的視頻輸出接口,視頻處理芯片可以直接輸出,不需要涉及到USB接口攝像頭所需的視頻壓縮芯片以及USB接口芯片,所以較市面上普通的USB攝像頭來說,CSI接口的攝像頭更便宜,配合ESM6800V形成了一個低成本的圖像應用方案。


  ESM6800的內核版本為Linux-4.1.15,同時英創公司在ESM6800上移植了基于xcb(X11)平臺的Qt-5.8.0,關于Qt和X11的介紹,可以參考網站文章《ESM6802 X11桌面圖形系統簡介》。CSI攝像頭選用Omnivision公司130萬像素的ov9652(最高分辨率1280×1024)和500萬像素的ov5640(最高分辨率2560×1920),在ESM6800V的系統中已經集成了這兩款攝像頭的驅動,并且能夠自動識別并加載相應的驅動,加載驅動后會自動生成設備節點:“/dev/video0",應用程序可以操作該設備節點對攝像頭進行圖像的采集和控制。


  CSI攝像頭都是用了V4L2驅動提供的標準API來操作的。Video for Linux 2簡稱V4L2,是V4L的改進版。本例中采集的圖像分辨率為640×480,接下來就來介紹一下主要的操作,首先打開設備文件:

  int fd;

       fd=open("/dev/video0",O_RDWR);


  設置視頻的制式和幀格式,制式包括PAL,NTSC,幀的格式個包括寬度和高度等:

  /*set the form of camera capture data*/

  tv_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;      /*v4l2_buf_typea,camera must use V4L2_BUF_TYPE_VIDEO_CAPTURE*/

  tv_fmt.fmt.pix.width = 640;                                        /*設置圖形分辨率,水平:640 像素*/

  tv_fmt.fmt.pix.height = 480;                                       /*設置圖形分辨率,垂直:480 像素*/

  tv_fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;   /*V4L2_PIX_FMT_YYUV*/

  tv_fmt.fmt.pix.field = V4L2_FIELD_NONE;                  /*V4L2_FIELD_NONE*/

  if (ioctl(fd, VIDIOC_S_FMT, &tv_fmt)< 0)

  {

    fprintf(stderr,"VIDIOC_S_FMT set err\n");

    exit(-1);

    close(fd);

  }


  向驅動申請幀緩沖,一般不超過五個:

  struct v4l2_requestbuffers req;

  req.count=2;

  req.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;

  req.memory=V4L2_MEMORY_MMAP;

  //申請幀緩沖

  ret=ioctl(fd,VIDIOC_REQBUFS,&req);

  if(ret<0)

  {

    printf("failture VIDIOC_REQBUFS\n");

    return -1;

  }


  將申請到的幀緩沖映射到用戶空間,這樣就能夠直接操作幀緩沖了:

  for (n_buffers = 0; n_buffers < req.count; ++n_buffers)

  {

    struct v4l2_buffer buf;

    memset(&buf,0,sizeof(buf));

    buf.type =V4L2_BUF_TYPE_VIDEO_CAPTURE;

    buf.memory =V4L2_MEMORY_MMAP;

    buf.index =n_buffers;

    // 查詢序號為n_buffers 的緩沖區,得到其起始物理地址和大小

    if (-1 == ioctl(fd, VIDIOC_QUERYBUF, &buf))

    {

      printf("failture VIDIOC_QUERYBUF\n");

      return -1;

    }

    buffers[n_buffers].length= buf.length;

    // 映射內存

    buffers[n_buffers].start=mmap (NULL,buf.length,PROT_READ | PROT_WRITE ,MAP_SHARED,fd, buf.m.offset);

    if (MAP_FAILED == buffers[n_buffers].start)

    {

      printf("failture mmap\n");

      return -1;

    }

  }


  開始視頻的采集:

  type =V4L2_BUF_TYPE_VIDEO_CAPTURE;

  ioctl (fd,VIDIOC_STREAMON, &type);


  struct v4l2_buffer camera_buf;

  CLEAR (camera_buf);

  camera_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

  camera_buf.memory = V4L2_MEMORY_MMAP;

  //取出一個緩沖幀

  i1 = ioctl (fd, VIDIOC_DQBUF, &usr_buf);

  if(i1<0)

  {

    printf("failture\n");

    return -1;

  }


  例程的效果如下:


CSI攝像頭接口及在英創主板上的應用.gif


  所以通過這一套通用的V4L2接口來操作攝像頭的工作流程就能夠讀取攝像頭的數據了,基于CSI接口攝像頭,英創公司提供了一套完整的應用方案,有興趣的客戶請點擊下載:《ESM6800V支持CSI接口攝像頭》

文章標簽:C/C++ESM6800
主站蜘蛛池模板: 男啪女视频免费观看网站| 大陆精品偷拍视频在线播放 | 九九精品在线视频| 亚洲国产精品自在现线让你爽| 国产 网红 喷水 播放| 成人综合视频网| 久久成人免费网站| 人超级碰碰视频在线观看| 一级艳片| 日本在线亚州精品视频在线| 亚洲美女免费视频| 免费在线色视频| 欧美日韩第三页| 国产下药迷倒白嫩美女网站| 国产精品情侣| 美国一级大黄一片免费网站| 激情五月色综合婷婷大片| 国产成人精品系列在线观看| 精品精品久久宅男的天堂| 欧美69视频在线| 日韩高清第一页| 天天做天天爱天天影视综合| 妖精视频免费入口| 91视频一88av| 97国产大学生情侣11在线视频| 三级视频在线播放线观看| 尤物免费在线观看| 日本一级特黄特色大片免费视频| 中文字幕久久久久| 正在播放的国产a一片| 亚洲免费看片| 亚洲免费毛片| 亚洲永久精品免费www52zcm男男| 在线性视频| 欧美一级中文字幕| 国产在线激情视频| 国产美女视频一区| 国产草草视频| 国产成人综合亚洲| 国产亚洲精品bv在线观看| 泰国一级毛片aaa下面毛多|