嵌入式系统视频图像捕获研究
种图像处理的程序中往往需要在两种格式之间转换。由于在笔者所采用的设备中,采集到的图像为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] 首先需要计算出屏幕内存空间的字节数,计算公式为: 屏幕内存空间的字节数=像素的个数w每个像素占用的字节 其中像素的个数是行和列的乘积,而行和列的数值以及每个像素占用的字节数值可以通过函数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); 然后将前文得到的数据赋值即可。上面的函数的具体意义,读者可以参看相关技术文档,限于篇幅本文没有阐述。这个过程和前文所述的捕获过程是相反的过程。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,由于篇幅的限制本文没有具体阐述整个系统,集中阐述了视频图像数据的捕获和显示,在这一过程中存在许多细节问题,限于篇幅没有阐述。
- 电子系统级设计和验证方法学在SoC设计中的应用(06-05)
- STC单片机PCA捕获中断函数(11-29)
- STM32芯片定时器输入捕获模式(11-28)
- stm32的PWM输入捕获模式(11-28)
- FTM的PWM、输入捕获、正交解码(11-27)
- STM32输入捕获模式(11-26)