当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]嵌入式系统视频图像捕获研究

本文论述了嵌入式系统相关理论、嵌入式Linux的基本概念,主要阐述了采用嵌入式Linux进行视频图像数据的捕获、存储、显示等。采用的关键技术包括 V4L、framebuffer、数字图像格式变换等,提出了图像数据格式的变换方法。同时阐述了具体的实现方法。

       1 嵌入式系统简介

      嵌入式系统(Embedded System)是指以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。根据IEEE(国际电气和电子工程师协会)的定义,嵌入式系统是“控制、监视或者辅助设备、机器和车间运行的装置”,这个定义主要是从应用的角度进行定义的。[1]嵌入式系统的操作系统和功能软件集成于计算机硬件系统之中,也就是软件与硬件的一体化。嵌入式系统目的性或针对性很强,一般要求较高的实时性、稳定性。

      2  嵌入式Linux操作系统

      嵌入式Linux是Linux操作系统的一个分支。主要是对通常的Linux进行裁减。最关键的是要进行实时化处理。在实时性要求不是太高的环境下采用Linux具有很多优势。使用嵌入式Linux技术开发嵌入式设备的最大方便是使开发工作从硬件与汇编程序转移到应用软件上来。[2]嵌入式Linux系统架构包括三层:应用程序、系统共享库和Linux内核。现有各种开源的Linux版本,包括支持没有内存管理单元的CPU的uCLinux、实时性非常好的RTAI、QLinux等。[3]本文所采用的开发的系统是进行图像的实时捕获。由于实时性要求不高,同时考虑到Linux下使用V4L开发视频程序具有很大的优越性,所以采用嵌入式Linux作为开发环境。芯片主要采用三星公司生产的ARM2410, 开发板采用北京博创公司的板卡。

      3  采用V4L进行数据采集

      3.1 采用V4L进行图像数据采集

       V4L是Linux下提供的一套设备驱动程序文件API,用于开发视频(Video)、音频(Audio)等领域的应用程序。由于在Linux下设备都作为一个文件进行处理。所以可以通过打开相应的设备文件来获取设备的信息。由于本文是进行视频程序的开发,所以仅讲述有关视频相关的部分。

      视频设备文件一般情况下在/dev/videox。其中x可以为0~63之间的整数。一般情况下为/deev/video0。当在开发板上通过USB接口将摄像头接入后。在程序中对文件video0进行读的操作就是对摄像头的操作。

      在使用V4L之前首先需要将头文件videodev.h引入,如<linux/videodev.h>。相应的API文档在/usr /src/linux-2.4/Documentation/video4linux/API.html下。同时在为了同相关的设备进行通信,需要一些结构体、变量和函数,所以需要包含其他的相关文件。如<sys/types.h>、

      <sys/stat.h>、 <sys/ioctl.h>、 <sys/mman.h>、 <linux/videodev.h>、 <fcntl.h>、 <unistd.h>等。摄像头、V4L、设备驱动程序、嵌入式Linux操作系统的关系用图1表示如下。

        

                                       图1

        具体的图像数据的捕获过程为:打开设备文件、查询和确认设备性能、设置捕获的图像的宽和高、设置色深、建立内存映射(后文阐述)、读取图像数据、关闭设备。[4]

        具体的这个过程由于篇幅关系本文将不做具体阐述,读者可以查阅本文的参考文献3。在上述的过程中主要考虑的问题是内存的映射问题。为了读取数据首先需要将显示设备的地址映射到系统地址上来,这需要调用函数mmap()。该函数返回的地址就是存放图像数据的地址。每一帧图像都偏移固定的长度。而摄像头取得图像会包含若干帧。这样通过周而复始的进行就可以将图像数据捕获下来。具体过程和涉及到的函数如下所示:

        打开设备文件: int  device = open ("/dev/v4l/video0", O_RDWR);

        内存映射:char* memoryMap = (char*)mmap (0, memoryBuffer.size, PROT_READ | PROT_WRITE, MAP_SHARED, device, 0);

        图像数据memoryMap + memoryBuffer.offsets[bufferIndex]
      

                          图2[!--empirenews.page--]3.2图像格式的转换。

 

       通过上文所述取得图像数据后,实际就是一块地址。这时就可以进行各种图像处理或图像识别。问题的关键是图像数据是如何放置的。一般情况下,在计算机中一个像素点是由R、G、B三种颜色表示的。当然还存在其它的模式如PAL等。但大多数为RGB模式。即使是RGB模式也存在很多种情况,如每一个像素由8个bit组成,这时R、G、B三种颜色的位数分别3、3、2。如果每一个像素由12个bit组成,则R、G、B三种颜色的位数分别4、4、4。如果每一个像素由16个bit组成,则R、G、B三种颜色的位数存在两种情况分别5、5、5,最高位舍弃,另一种情况为5、6、5。最容易处理、同时也是最常见的是24个bit组成的,这时R、G、B三种颜色的位数分别8、8、8。

       在各种图像处理的程序中往往需要在两种格式之间转换。由于在笔者所采用的设备中,采集到的图像为24位,而显示设备为12位,这就需要在两种格式之间转换。至于怎样将图像数据显示到屏幕上在后文中阐述,下面将主要阐述如何在24位和12位之间转换。整个过程如图3所示。          

 

         图3

       首先需要明确计算机中处理的数据是8位为基本单位的。所以,一个像素12位的图象格式可以通过两个像素24位为基本单位进行描述。其次,应该明确的是在从 8位数据到4位数据的转换中取得8位数据中的高4位,frame[index*3]&0xF0);然后再取得下一个8位的高4位;左移4位和前面的数据取并,frame[index*3]&0xF0)|((frame[index*3+1]&0xF0)>>4。实现的代码如下:

*(fbp) = (frame[index*3]&0xF0)|((frame[index*3+1]&0xF0)>>4);

                     *(fbp +1) = (frame[index*3+2]&0xF0)|(frame[(index+1)*3]&0xF0>>4);

            *(fbp+2) = (frame[(index+1)*3+1]&0xF0)|(frame[(index+1)*3+2]&0xF0>>4);

       在这段代码中*(fbp)、*(fbp +1)、*(fbp+2)这三个8位实际上两个像素的图像数据。这就实现了24位的图像数据到12位的图像数据的转换。

       4应用framebuffer进行图像的显示

       为了将程序中图像数据显示在设备的液晶屏幕上,需要读出现实设备的地址并将其映射到系统内存空间上,然后再将图像数据写到映射后的地址空间上。[5]

        首先需要计算出屏幕内存空间的字节数,计算公式为: 

  屏幕内存空间的字节数=像素的个数╳每个像素占用的字节

其中像素的个数是行和列的乘积,而行和列的数值以及每个像素占用的字节数值可以通过函数ioctl()取得或设置。下述代码为打开framebuffer,读取屏幕的可设置信息,并计算屏幕内存空间的字节数的过程。

struct fb_var_screeninfo vinfo;

int FraBuf= open("/dev/0", O_RDWR);

ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo);

long int screensize = vinfo.xres * vinfo.yres* vinfo.bits_per_pixel;

       取得屏幕的大小后,将打开的设备FraBuf得到的内存空间映射到系统中,如下所示,

char *fbp fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED,fbfd, 0);

      然后将前文得到的数据赋值即可。上面的函数的具体意义,读者可以参看相关技术文档,限于篇幅本文没有阐述。这个过程和前文所述的捕获过程是相反的过程。[!--empirenews.page--]5简单字符的屏幕显示技术

 

        在数字图像处理过程中,为了将处理后结果或数字显示出来,可以在屏幕上开个区域进行显示。如若字体较多需要字库,如果仅仅是简单的数字可以采用像素描绘的方法。本文作者就是采用后者输出了数字。如数字“1”的描绘程序如下:

x=160;

for ( y = 210; y < 230; y++ ) {

location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) +y+vinfo.yoffset) * finfo.line_length;

     *(fbp + location) = 10;

     *(fbp + location + 1) =10;

     *(fbp + location + 2) =10;

}

      其中x、y为屏幕的位置,而fbp就是前文打开的设备。

       6 结束语

       本文采用的设备是基于SAMSUNG公司的ARM9芯片S3C2410,由于篇幅的限制本文没有具体阐述整个系统,集中阐述了视频图像数据的捕获和显示,在这一过程中存在许多细节问题,限于篇幅没有阐述。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

助力科研与检测新突破 上海2024年5月15日 /美通社/ -- 全球知名的科学仪器和服务提供商珀金埃尔默公司今日在上海举办了主题为"创新不止,探索无界"的新品发布会,集中展示了其在分析仪器领域的最...

关键字: 质谱仪 BSP DSC 气相色谱

上海2024年5月16日 /美通社/ -- 2024年5月10日至5月13日,富士胶片(中国)投资有限公司携旗下影像产品创新力作亮相北京P&E 2024。在数码相机展览区域,全新制定的集团使命"为世界绽...

关键字: 富士 数码相机 影像 BSP

贝克曼库尔特目前已成为MeMed Key免疫分析平台和MeMed BV检测技术的授权经销商 在原有合作的基础上,继续开发适用于贝克曼库尔特免疫分析仪的MeMed BV检测 加州布瑞亚和以色列海法2024年5月16日...

关键字: BSP IO 检测技术 免疫分析仪

英国英泰力能的燃料电池是可产业化的产品解决方案 英国首个专为乘用车市场开发的燃料电池系统 在 157kW 功率下,此燃料电池比乘用车的其他发动机更为强大 &...

关键字: ENERGY INTELLIGENT 氢燃料电池 BSP

深爱人才,共赴"芯"程 深圳2024年5月15日 /美通社/ -- 5月11日,深圳国资国企"博士人才荟"半导体与集成电路产业专场活动在深圳市重投天科半导体有限公司(简...

关键字: 半导体 集成电路产业 BSP 人工智能

武汉2024年5月15日 /美通社/ -- 北京时间4月26日-5月4日,2024 VEX 机器人世界锦标赛于美国得克萨斯州达拉斯市举办。本届 VEX 世锦赛为期九天,设有 VIQRC 小学组/初中组、V5RC 初中组/...

关键字: 机器人 BSP RC POWERED

上海2024年5月15日 /美通社/ -- 由生成式人工智能(AI)驱动的临床阶段生物医药科技公司英矽智能宣布,与复星医药(600196.SH;02196.HK)合作开发的潜在"全球首创"候选药物IS...

关键字: ISM BSP PC 人工智能

上海2024年5月13日 /美通社/ -- 5月8日,浦东新区国资委组织陆家嘴集团等9家区属企业与立邦中国召开合作交流会,旨在贯彻落实浦东新区区委、区政府工作要求,进一步放大进博会溢出带动效应,持续扩大区属企业与进博会重...

关键字: BSP 数字化 自动化立体仓库 智慧园区

上海2024年5月13日 /美通社/ -- 在数字化时代,高效的税务管理和ERP系统成为企业发展的关键。为了满足这一需求商应信息科技与Exact Software 易科软件就金四全电票税系统与ERP系统集成及商务合作建立...

关键字: AC 软件 BSP 数字化

北京2024年5月13日 /美通社/ -- 5月11日,鲲鹏昇腾开发者大会2024期间,华为举办"昇思AI框架及大模型技术论坛",软通动力数字基础设施与集成事业部总经理谢睿受邀出席、软通动力...

关键字: AI 模型 BSP 精度
关闭
关闭