linux 中怎么使用LVGL 获取摄像头数据 并实时显示,用什么控件或者例程实现呢

以下是我的代码,我这面现在已经将摄像头数据 转换成RGB 直接映射到LCD屏幕上可以正常显示,但是想通过LVGL 显示的话 就存在问题 myrgb指向我转换成功的RGB数据,想用画布实现,但是这个数据复制到画布 好像也有问题,
麻烦问下大家 ,有没有什么例程 参考转换摄像头数据通过LVGL实时显示摄像头图像

//新建一个video frame img 实例 类型为LV_IMG_CF_TRUE_COLOR_ALPHA,data地址为frame data缓存地址
	lv_img_dsc_t img_lv_dec_video = {
		  .header.always_zero = 0,
		  .header.w = 640,
		  .header.h = 480,
		  .data_size = 640 * 480 * 3,
		  .header.cf = LV_IMG_CF_INDEXED_8BIT,
		  .data = (const uint8_t * )(myrgb),
	};
//新建一个img obj,以确定其和其他空间的层级位置关系,将video img结构图赋值给img obj

    lv_obj_t * video_img = lv_img_create(lv_scr_act(), NULL);
    lv_img_set_src(video_img , &img_lv_dec_video );
    lv_obj_align(video_img , NULL, LV_ALIGN_IN_TOP_MID, 0, 0);
       //刷新dec frame 地址,传入新的一帧地址并刷新
        img_lv_dec_video.data = (const uint8_t * )myrgb;

        lv_img_set_src(video_img , &img_lv_dec_video ); 
            //引发刷新操作
        lv_obj_invalidate(video_img);   

推荐使用画布,但是要注意lvgl的处理速度主要是看心跳,默认是5ms/次

画布接口: lv_canvas_draw_img

老师 ,麻烦您再指点一下,我发现在里面加了while 循环之后 画布就不显示了(要是没有while 的话,可以设置画布的颜色),而且好像我把转换的RGB数据 赋给画布 也没有任何显示,是我哪儿的参数 设置的不对吗?
lcd_show_rgb()函数的话 就是直接映射到LCD显示 是正常的

#define CANVAS_WIDTH   640
#define CANVAS_HEIGHT  480

void v4l2_read_data(void)
{
    struct v4l2_buffer buf = {0};
    unsigned short *base;
    unsigned short *start,*rgb;
    int min_w, min_h;
    int j;
    uint32_t x;
    uint32_t y;
    lv_draw_rect_dsc_t my_img_draw_dsc;
 //   unsigned short *  myrgb = malloc(frm_width*frm_height*3);
    unsigned char  myrgb[frm_width*frm_height*3];

    if (width > frm_width)
        min_w = frm_width;
    else
        min_w = width;
    if (height > frm_height)
        min_h = frm_height;
    else
        min_h = height;

    lv_draw_rect_dsc_init(&my_img_draw_dsc);
    my_img_draw_dsc.radius = 10;
    my_img_draw_dsc.bg_opa = LV_OPA_COVER;

    /*Create a buffer for the canvas*/
    static lv_color_t cbuf[LV_CANVAS_BUF_SIZE_INDEXED_1BIT(CANVAS_WIDTH, CANVAS_HEIGHT)];
 
    /*Create a canvas and initialize its the palette*/
    lv_obj_t* canvas = lv_canvas_create(lv_scr_act(), NULL);
    lv_canvas_set_buffer(canvas, cbuf, CANVAS_WIDTH, CANVAS_HEIGHT, LV_IMG_CF_INDEXED_1BIT);
    lv_canvas_set_palette(canvas, 0, LV_COLOR_TRANSP);
    lv_canvas_set_palette(canvas, 1, LV_COLOR_RED);
 
    
    /*Create colors with the indices of the palette*/
    lv_color_t c0;
    lv_color_t c1;
 
    c0.full = 0;
    c1.full = 1;
 
    /*Transparent background*/
    lv_canvas_fill_bg(canvas, c1, LV_OPA_TRANSP);
 
    /*Create hole on the canvas*/
    for (y = 10; y < 30; y++) {
        for (x = 5; x < 20; x++) {
            lv_canvas_set_px(canvas, x, y, c0);
        }
    }

    printf("test is 2 \n");


    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    buf.memory = V4L2_MEMORY_MMAP;


    while (1)
    {         
        lv_canvas_fill_bg(canvas, c1, LV_OPA_TRANSP);

        for(buf.index = 0; buf.index < FRAMEBUFFER_COUNT; buf.index++) 
        {
            ioctl(v4l2_fd, VIDIOC_DQBUF, &buf);     //出队
            start=buf_infos[buf.index].start;
            YUV2RGB(start, myrgb,frm_width,frm_height,0,0);  //把YUYV数据解码为RGB数据
//          lcd_show_rgb(myrgb,frm_width,frm_height); 
            lv_canvas_draw_img(canvas,0,0,myrgb,&my_img_draw_dsc);
 //            lv_canvas_copy_buf(canvas,myrgb,0,0,600,400);
     
            ioctl(v4l2_fd, VIDIOC_QBUF, &buf);
        }
    }


}

上面的代码跑下来,提示这个错误
:joy:
Warn: lv_canvas_draw_img: can’t draw to LV_IMG_CF_INDEXED canvas (lv_canvas.c #851 lv_canvas_draw_img())

你应该在其他线程采集数据并且放入缓冲区中给lvgl画布使用(生产者消费者模型),lvgl需要知道你要显示的img数据才能正常显示(比如宽高),因此还需要提供一些额外的数据给到lvgl

好的 谢谢老师,那我现在转换RGB格式的数据这样配置可以吗

unsigned char  myrgb[frm_width*frm_height*3];  //我转换后的存放的rgb 图像buf

static lv_color_t cbuf[LV_CANVAS_BUF_SIZE_INDEXED_1BIT(CANVAS_WIDTH, CANVAS_HEIGHT)];

 lv_obj_t* canvas = lv_canvas_create(lv_scr_act(), NULL);

 lv_canvas_set_buffer(canvas, cbuf, CANVAS_WIDTH, CANVAS_HEIGHT, LV_IMG_CF_INDEXED_8BIT);
//这个地方的参数 RGB 格式的数据 用这个参数可以吗 LV_IMG_CF_INDEXED_8BIT

 lv_canvas_draw_img(canvas,0,0,myrgb,&my_img_draw_dsc); //这样直接把数据传给画布就行了吧

老师 按照您推荐的方式 创建线程 往画布中写数据 但是 现在又有个问题,我从摄像头直接装换出来的RGB数据 直接复制到画布上 提示有错误
Warn: lv_canvas_draw_img: can’t draw to LV_IMG_CF_INDEXED canvas (lv_canvas.c #851 lv_canvas_draw_img())

这样是不是说我转换出来的RGB格式的数据 不对呢

void lv_canvas_draw_img(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, const void * src,
                        const lv_draw_img_dsc_t * img_draw_dsc)
{
    LV_ASSERT_OBJ(canvas, LV_OBJX_NAME);

    lv_img_dsc_t * dsc = lv_canvas_get_img(canvas);

    if(dsc->header.cf >= LV_IMG_CF_INDEXED_1BIT && dsc->header.cf <= LV_IMG_CF_INDEXED_8BIT) {
        LV_LOG_WARN("lv_canvas_draw_img: can't draw to LV_IMG_CF_INDEXED canvas");
        return;
    }
。。。。。。。。。

lv_canvas_set_buffer的参数指定颜色格式

好的好的 谢谢老师 :smiling_face_with_three_hearts:

您好,您最后搞定了吗,可以请教一下吗