666
1
以下是我的代码,我这面现在已经将摄像头数据 转换成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
666
5
老师 ,麻烦您再指点一下,我发现在里面加了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);
}
}
}
666
7
上面的代码跑下来,提示这个错误
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
666
10
好的 谢谢老师,那我现在转换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); //这样直接把数据传给画布就行了吧
666
11
老师 按照您推荐的方式 创建线程 往画布中写数据 但是 现在又有个问题,我从摄像头直接装换出来的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;
}
。。。。。。。。。
biubiu
12
lv_canvas_set_buffer的参数指定颜色格式