您好,我正在使用MIMXRT1176DMAA芯片。该板配备MIPI摄像头和MIPI液晶显示屏,液晶显示屏主要用于显示LVGL GUI。
目前,我希望在屏幕上显示摄像头的图像,同时在摄像头画面上叠加一些 LVGL 标签。我尝试通过 LVGL Canvas 显示相机帧,但这种方法在将相机帧传输到 Canvas 时引入了额外的处理开销,导致 CPU 使用率高和相机画面卡顿。
请问这个问题有解决办法吗?例如,LCDIFV2 的层功能能否用于在不同的层上显示内容?非常感谢您能提供任何建议。
你好@Vinos ,如果这不是秘密,那解决方案是什么?
此致敬礼
经过尝试,我发现只有在 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);
}我的代码有错误吗?谢谢。
@Vinos ,你好!
请查看以下链接: https://github.com/lvgl/lvgl/issues/262我相信这对您的询问会很有帮助。
如果对你有帮助,请告诉我!
埃德温。
嗨@Vinos ,
我不清楚您打算如何申请这份申请,所以以下是我的建议:
请参考示例“SDK_MIMXRT1170-EVK\boards\evkmimxrt1170\driver_examples\csi\mipi_rgb”。需要将摄像机捕获的视频与 LVGL 的帧缓冲区进行合成。有两种方法可以做到这一点:
1)将相机图像从相机输出缓冲区复制到LVGL的帧缓冲区。虽然可以用 memcpy 实现,但性能会很差,所以我建议改用 DMA。
2) 直接使用另一层 LCDIFv2 作为相机的输出缓冲区,然后 LCDIFv2 硬件在显示屏上合成不同的层而无需复制。
BR,
埃德温。