【LCD 应用编程】获取LCD屏幕参数信息(分辨率、像素深度、RGB格式)

目录

一、LCD显示的基本原理

1、认识 FrameBuffer

2、理解LCD的分辨率和深度

二、接口函数 ioctl

1、函数声明

2、结构体介绍

三、获取LCD屏的信息(分辨率、深度)


一、LCD显示的基本原理

1、认识 FrameBuffer

FrameBuffer 是帧缓冲,可以看做是一块内存,帧缓冲是一种显示驱动接口,该接口屏蔽了显示设备(如LCD)硬件层面的实现。在应用层看来,显示设备就是一块内存,操作这块内存就相当于在操作显示设备

在Linux 系统中,显示设备也叫做 FrameBuffer 设备,LCD就是 FrameBuffer 设备,FrameBuffer 设备对应的设备文件为 /dev/fdX(X=0、1、2 ...),一般 /dev/fb0 代表LCD显示屏。应用程序读写 /dev/fbX 就相当于读写显示设备的显存(显示缓冲区)

2、理解LCD的分辨率和深度

说到显示设备或者图片,我们经常会提到 分辨率像素深度 的概念

  • 分辨率:一行有多少个像素点,一列有多少个像素点
  • 像素深度:每个像素点要用多少bit来表示

假设LCD 的分辨率是 800*480,每个像素点用 RGB565 来表示。

800*480每行有 800 个像素点,每列有 480 个像素点
RGB565

每个像素点由R、G、B三种颜色表示

        - R 占 5 bit

        - G 占 6 bit

        - B 占 5 bit

前面说到,显示设备其实可以看做是显示缓冲区,显示缓冲区的大小 = 分辨率 * 像素深度

二、接口函数 ioctl

1、函数声明

ioctl 的用途会根据其传入的参数发生变化,ioctl函数声明如下:

第一个参数是文件描述符,即FrameBuffer 设备对应的设备文件 /dev/fdX(X=0、1、2 ...)

第二个参数需传入一个宏,第二个参数决定了 ioctl 函数的用途

第二个参数含义
FBIOGET_VSCREENINFO获取 FrameBuffer 设备的可变参数信息
FBIOPUT_VSCREENINFO设置 FrameBuffer 设备的可变参数信息
FBIOGET_FSCREENINFO获取 FrameBuffer 设备的固有参数信息

第三个参数所传入的类型会随着第二个参数变化。

第二个参数第三个参数类型
FBIOGET_VSCREENINFOstruct fb_var_screeninfo *
FBIOPUT_VSCREENINFOstruct fb_var_screeninfo *
FBIOGET_FSCREENINFOstruct fb_fix_screeninfo *
// 获取设备可变参数信息
struct fb_var_screeninfo fb_var;
int fd = 0;
if((fd = open("/dev/fb0", O_RDWR) < 0))
{
    perror("open fb failed");
    exit(-1);
}

ioctl(fd, FBIOGET_VSCREENINFO, &fb_var);

2、结构体介绍

上面第三个参数中涉及到多种结构体 struct fb_var_screeninfostruct fb_fix_screeninfo ,我们如果要获取到可变参数的信息,势必需要了解对应结构体包含的成员变量。

struct fb_var_screeninfo

struct fb_var_screeninfo {
     __u32 xres; /* 可视区域,一行有多少个像素点,X 分辨率 */
     __u32 yres; /* 可视区域,一列有多少个像素点,Y 分辨率 */    

     __u32 bits_per_pixel; /* 每个像素点使用多少个 bit 来描述,也就是像素深度 bpp */
     __u32 grayscale; /* =0 表示彩色, =1 表示灰度, >1 表示 FOURCC 颜色 */
     /* 用于描述 R、G、B 三种颜色分量分别用多少位来表示以及它们各自的偏移量 */
     struct fb_bitfield red; /* Red 颜色分量色域偏移 */
     struct fb_bitfield green; /* Green 颜色分量色域偏移 */
     struct fb_bitfield blue; /* Blue 颜色分量色域偏移 */
     struct fb_bitfield transp; /* 透明度分量色域偏移 */
    
    // ... ...
};

其中 struct fb_bitfield 结构体的声明如下。下面的 “偏移量” 可以参考本文最后一部分的结果分析

struct fb_bitfield {
     __u32 offset; /* 偏移量 */
     __u32 length; /* 长度 */
     __u32 msb_right; /* != 0 : Most significant bit is right */
}   

struct fb_fix_screeninfo

struct fb_fix_screeninfo {
     char id[16]; /* 字符串形式的标识符 */
     unsigned long smem_start; /* 显存的起始地址(物理地址) */
     __u32 smem_len; /* 显存的长度 */
     __u32 type;
     __u32 type_aux;
     __u32 visual;
     __u16 xpanstep;
     __u16 ypanstep;
     __u16 ywrapstep;
     __u32 line_length; /* 一行的字节数 */
     unsigned long mmio_start; /* Start of Memory Mapped I/O(physical address) */
     __u32 mmio_len; /* Length of Memory Mapped I/O */
     __u32 accel; /* Indicate to driver which specific chip/card we have */
     __u16 capabilities;
     __u16 reserved[2];
};

三、获取LCD屏的信息(分辨率、深度)

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/fb.h>

int main(int args, char **argv)
{
    struct fb_fix_screeninfo fb_fix;        // 固定参数信息
    struct fb_var_screeninfo fb_var;        // 可变参数信息

    int fd = open("/dev/fb0", O_RDWR);
    if (fd < 0)
    {
        perror("open fb failed");
        return -1;
    }

    ioctl(fd, FBIOGET_FSCREENINFO, &fb_fix);    // 获取固定参数信息
    ioctl(fd, FBIOGET_VSCREENINFO, &fb_var);    // 获取可变参数信息
    printf(
        "分辨率:%d * %d \n"    \
        "像素深度:%d bit \n"   \
        "像素格式: R<%d %d> G<%d %d> B<%d %d>\n",  \
        "每行所占大小:%d 字节 \n", \
        fb_var.xres, fb_var.yres, \
        fb_var.bits_per_pixel, \
        fb_var.red.offset, fb_var.red.length,  \
        fb_var.green.offset, fb_var.green.length, \
        fb_var.blue.offset, fb_var.blue.length, \
        fb_fix.line_length
    );

    close(fd);
    return 0;
}

分辨率:每行有 800 个像素点,每列有 480 个像素点

像素深度:用 16bit 来表示每个像素点

像素格式:使用的格式是 RGB565,红色(R)占 5 bit,绿色(G)占 6 bit,蓝色(B)占 5 bit

每行所占字节数 = 行像素点数 * 像素深度 = 800 * 16 = 12800 bit = 1600 字节

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要获取图像中每个像素深度信息值,可以使用OpenCV库提供的深度图像相关函数来实现。具体步骤如下: 1. 导入必要的库和模块: ```python import cv2 import numpy as np ``` 2. 读取深度图像: ```python depth_image = cv2.imread('depth_image.png', cv2.IMREAD_UNCHANGED) ``` 3. 将深度图像转换为浮点型数据,方便进行后续计算: ```python depth_image = depth_image.astype(np.float32) ``` 4. 访问每个像素深度信息值: ```python height, width = depth_image.shape for y in range(height): for x in range(width): depth_value = depth_image[y, x] # 对每个像素深度值进行处理或分析 # ... ``` 在上述代码中,`depth_image`是一个包含每个像素深度信息的二维数组,通过`depth_image[y, x]`可以得到图像特定位置上的深度值,其中`y`和`x`分别表示像素的行和列索引。你可以根据需要对每个像素深度值进行后续处理或分析,比如计算平均深度、检测深度边缘等。 需要注意的是,获取深度信息的图像通常是灰度图像,保存每个像素深度值,而不是RGB图像。这样做可以减少存储空间,并方便后续处理。 ### 回答2: 在Python中,可以使用OpenCV库来获取图像中每个像素深度信息值。 首先,需要安装OpenCV库。可以使用pip工具在命令行中运行以下命令进行安装: ``` pip install opencv-python ``` 安装完成后,可以导入cv2模块来使用OpenCV库的功能: ```python import cv2 ``` 接下来,使用cv2模块中的imread()函数读取图像文件,该函数将返回一个表示图像的数组: ```python image = cv2.imread('image.jpg') ``` 读取图像后,可以使用cv2模块中的split()函数将图像的RGB通道拆分为单独的通道数组: ```python b, g, r = cv2.split(image) ``` 得到每个通道的数组后,可以访问数组中的每个元素来获取像素深度信息值。每个数组的元素表示图像中每个像素点的颜色值,因此通过访问这些元素可以获取深度信息值。 ```python # 获取第一个像素点的深度信息值 depth_value = b[0][0] ``` 这样,就可以获取图像中每个像素深度信息值了。需要注意的是,深度信息值的具体含义可能因不同的图像来源而异,例如,对于一些深度图像,深度信息值可能表示像素与摄像机的距离。 综上所述,在Python中可以使用OpenCV库来获取图像中每个像素深度信息值。 ### 回答3: 在Python中,可以使用PIL库来获取图像中每个像素深度信息值。首先,需要使用PIL库中的Image.open()方法打开图像文件,并将其存储在一个变量中。接下来,使用变量的load()方法将图像加载为一个像素访问对象。 ```python from PIL import Image # 打开图像文件 img = Image.open('image.jpg') # 加载为像素访问对象 pixels = img.load() # 获取图像的宽度和高度 width, height = img.size # 遍历每个像素 for y in range(height): for x in range(width): # 获取像素深度信息值 depth = pixels[x, y] # 处理深度信息值 # ... # 关闭图像文件 img.close() ``` 在上面的代码中,首先使用Image.open()方法打开图像文件,然后使用load()方法加载图像为一个像素访问对象。之后,使用两个嵌套的循环遍历每个像素,通过访问pixels[x, y]来获取每个像素深度信息值。可以根据具体需求进行后续处理。 需要注意的是,上述代码是以每个像素的位置(x, y)作为索引来获取深度信息值的,而不是直接获取深度信息值。因此,在处理深度信息值之前,可能需要根据具体需求进行转换或者处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值