目前,英創(chuàng)公司在低成本核心板ESM6800的基礎(chǔ)上,推出了支持?jǐn)z像頭的版本ESM6800V,ESM6800V是在ESM6800H的基礎(chǔ)上,去掉了一路網(wǎng)口和6路擴(kuò)展串口,增加了一路CSI(COMS Sensor Interface)信號(hào)接口。ESM6800V的其它系統(tǒng)及接口配置與ESM6800完全相同。CSI是一個(gè)標(biāo)準(zhǔn)的視頻輸出接口,視頻處理芯片可以直接輸出,不需要涉及到USB接口攝像頭所需的視頻壓縮芯片以及USB接口芯片,所以較市面上普通的USB攝像頭來說,CSI接口的攝像頭更便宜,配合ESM6800V形成了一個(gè)低成本的圖像應(yīng)用方案。
ESM6800的內(nèi)核版本為Linux-4.1.15,同時(shí)英創(chuàng)公司在ESM6800上移植了基于xcb(X11)平臺(tái)的Qt-5.8.0,關(guān)于Qt和X11的介紹,可以參考網(wǎng)站文章《ESM6802 X11桌面圖形系統(tǒng)簡(jiǎn)介》。CSI攝像頭選用Omnivision公司130萬像素的ov9652(最高分辨率1280×1024)和500萬像素的ov5640(最高分辨率2560×1920),在ESM6800V的系統(tǒng)中已經(jīng)集成了這兩款攝像頭的驅(qū)動(dòng),并且能夠自動(dòng)識(shí)別并加載相應(yīng)的驅(qū)動(dòng),加載驅(qū)動(dòng)后會(huì)自動(dòng)生成設(shè)備節(jié)點(diǎn):“/dev/video0",應(yīng)用程序可以操作該設(shè)備節(jié)點(diǎn)對(duì)攝像頭進(jìn)行圖像的采集和控制。
CSI攝像頭都是用了V4L2驅(qū)動(dòng)提供的標(biāo)準(zhǔn)API來操作的。Video for Linux 2簡(jiǎn)稱V4L2,是V4L的改進(jìn)版。本例中采集的圖像分辨率為640×480,接下來就來介紹一下主要的操作,首先打開設(shè)備文件:
int fd;
fd=open("/dev/video0",O_RDWR);
設(shè)置視頻的制式和幀格式,制式包括PAL,NTSC,幀的格式個(gè)包括寬度和高度等:
/*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; /*設(shè)置圖形分辨率,水平:640 像素*/
tv_fmt.fmt.pix.height = 480; /*設(shè)置圖形分辨率,垂直: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 ");
exit(-1);
close(fd);
}
向驅(qū)動(dòng)申請(qǐng)幀緩沖,一般不超過五個(gè):
struct v4l2_requestbuffers req;
req.count=2;
req.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory=V4L2_MEMORY_MMAP;
//申請(qǐng)幀緩沖
ret=ioctl(fd,VIDIOC_REQBUFS,&req);
if(ret<0)
{
printf("failture VIDIOC_REQBUFS ");
return -1;
}
將申請(qǐng)到的幀緩沖映射到用戶空間,這樣就能夠直接操作幀緩沖了:
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;
// 查詢序號(hào)為n_buffers 的緩沖區(qū),得到其起始物理地址和大小
if (-1 == ioctl(fd, VIDIOC_QUERYBUF, &buf))
{
printf("failture VIDIOC_QUERYBUF ");
return -1;
}
buffers[n_buffers].length= buf.length;
// 映射內(nèi)存
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 ");
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;
//取出一個(gè)緩沖幀
i1 = ioctl (fd, VIDIOC_DQBUF, &usr_buf);
if(i1<0)
{
printf("failture ");
return -1;
}
例程的效果如下:
所以通過這一套通用的V4L2接口來操作攝像頭的工作流程就能夠讀取攝像頭的數(shù)據(jù)了,基于CSI接口攝像頭,英創(chuàng)公司提供了一套完整的應(yīng)用方案,有興趣的客戶請(qǐng)點(diǎn)擊下載:《ESM6800V支持CSI接口攝像頭》。
-
Linux
+關(guān)注
關(guān)注
87文章
11457瀏覽量
212772 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6096瀏覽量
36138
發(fā)布評(píng)論請(qǐng)先 登錄
基于RK3576開發(fā)板的網(wǎng)絡(luò)攝像頭方案

信創(chuàng)浪潮下,國(guó)產(chǎn)主板有什么新的發(fā)展機(jī)遇?

嘉立創(chuàng)廬山派,攝像頭和處理后的畫面有辦法通過無線的方式傳遞給電腦嗎?
RT1176是否有任何驅(qū)動(dòng)程序示例可以通過并行攝像頭接口與8/10/12位攝像頭通信?
米爾瑞芯微RK3576實(shí)測(cè)輕松搞定三屏八攝像頭
多光譜火焰檢測(cè)攝像頭

評(píng)論