1698144_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

1698144_zh-CN

1698144_zh-CN

如何在LVGL中流畅地显示相机帧?

您好,我正在使用MIMXRT1176DMAA芯片。该板配备MIPI摄像头和MIPI液晶显示屏,液晶显示屏主要用于显示LVGL GUI。

目前,我希望在屏幕上显示摄像头的图像,同时在摄像头画面上叠加一些 LVGL 标签。我尝试通过 LVGL Canvas 显示相机帧,但这种方法在将相机帧传输到 Canvas 时引入了额外的处理开销,导致 CPU 使用率高和相机画面卡顿。

请问这个问题有解决办法吗?例如,LCDIFV2 的层功能能否用于在不同的层上显示内容?非常感谢您能提供任何建议。

Re: How to smoothly display camera frames in LVGL?

你好@Vinos ,如果这不是秘密,那解决方案是什么?


此致敬礼

Re: How to smoothly display camera frames in LVGL?已解决。Re: How to smoothly display camera frames in LVGL?

经过尝试,我发现只有在 LVGL 任务关闭时,相机屏幕才能流畅运行。目前,Layer0 是 GUI,Layer1 是摄像头。当 Layer0 关闭且 Layer1 打开时,我想添加另一个 Layer2。在 Layer3 的中心,应该有一个空心圆,除了弧形部分以外,其余部分都是透明的。

因此,我使用了 ARGB4444 格式,并通过在 LCD 上绘制一个正方形进行了简单的测试(启用 Layer0 并禁用 Layer1;或者禁用 Layer0 并启用 Layer1)。然而,生成的图像并不透明。每当调用 LCDIFV2_SetLayerBlendConfig 函数时,LCD 上的 Layer3 都不会显示图像。但是,如果将此函数注释掉,液晶显示屏将显示预期的非透明图像。

以下是代码,请参考 SDK 中的示例“lcdifv2_embedded_alpha_cm7”。


#define LCD_WIDTH  480
#define LCD_HEIGHT 640
#define CENTER_LAYER 2

#define DEMO_FB0_ADDR ((uint32_t)s_frameBuffer[0])
AT_NONCACHEABLE_SECTION_ALIGN(
    uint8_t s_frameBuffer[1][LCD_HEIGHT][LCD_WIDTH][2],
    32);

void DEMO_FillFrameBuffer(void)
{
    uint32_t x, y;

    for (y = 0; y < LCD_HEIGHT; y++)
    {
        for (x = 0; x < LCD_WIDTH; x++)
        {
        	s_frameBuffer[0][y][x][0] = 0x11;
        	s_frameBuffer[0][y][x][1] = 0x11;
        }
    }
}

void lcd_center_layer_init()
{
	DEMO_FillFrameBuffer();
	/* Layer 1: ARGB4444 */
	const lcdifv2_buffer_config_t fb1Config = {
		.strideBytes = (LCD_WIDTH * 2),
		.pixelFormat = kLCDIFV2_PixelFormatARGB4444,
	};

	const lcdifv2_blend_config_t blend1Config = {
		.alphaMode = kLCDIFV2_AlphaEmbedded,
	};

	LCDIFV2_SetLayerBufferConfig(LCDIFV2, CENTER_LAYER, &fb1Config);

	LCDIFV2_SetLayerSize(LCDIFV2, CENTER_LAYER, 240, 240);

	LCDIFV2_SetLayerOffset(LCDIFV2, CENTER_LAYER, 0, 0);
        /* comment or not */
	LCDIFV2_SetLayerBlendConfig(LCDIFV2, CENTER_LAYER, &blend1Config);

	LCDIFV2_SetLayerBufferAddr(LCDIFV2, CENTER_LAYER, DEMO_FB0_ADDR);

	LCDIFV2_EnableLayer(LCDIFV2, CENTER_LAYER, true);

	LCDIFV2_TriggerLayerShadowLoad(LCDIFV2, CENTER_LAYER);
}

我的代码有错误吗?谢谢。

Re: How to smoothly display camera frames in LVGL?

@Vinos ,你好!

请查看以下链接: https://github.com/lvgl/lvgl/issues/262我相信这对您的询问会很有帮助。

如果对你有帮助,请告诉我!
埃德温。

Re: How to smoothly display camera frames in LVGL?谢谢你的建议。我尝试了第二种解决方案,但是在 LVGL 中,背景是白色的,上面有一些标签。实际结果是,除了标签之外,白色背景完全覆盖了相机图像。如何将这些白色背景设置为透明?Re: How to smoothly display camera frames in LVGL?

@Vinos

我不清楚您打算如何申请这份申请,所以以下是我的建议:

请参考示例“SDK_MIMXRT1170-EVK\boards\evkmimxrt1170\driver_examples\csi\mipi_rgb”。需要将摄像机捕获的视频与 LVGL 的帧缓冲区进行合成。有两种方法可以做到这一点:

1)将相机图像从相机输出缓冲区复制到LVGL的帧缓冲区。虽然可以用 memcpy 实现,但性能会很差,所以我建议改用 DMA。

2) 直接使用另一层 LCDIFv2 作为相机的输出缓冲区,然后 LCDIFv2 硬件在显示屏上合成不同的层而无需复制。

BR,
埃德温。


Tags (1)
No ratings
Version history
Last update:
Friday
Updated by: