K230中,请问怎么把Image图片对象的格式从rgb888转YUV420?

Viewed 207

请问怎么把Image图片对象的格式从rgb888转YUV420?
用的是Micropython固件

==================================

或者怎么编码RGB888格式的图片为H264?
我把venc例程中的Sensor.YUV420SP改为PIXEL_FORMAT_RGB_888,会报错 mpi sys munmap failed.

# frame_info.v_frame.pixel_format = Sensor.YUV420SP
frame_info.v_frame.pixel_format = PIXEL_FORMAT_RGB_888

VENC的例程是这个里面的4.2:https://developer.canaan-creative.com/k230_canmv/zh/main/zh/api/mpp/K230_CanMV_VENC%E6%A8%A1%E5%9D%97API%E6%89%8B%E5%86%8C.html#id3

1 Answers

编码器支持的格式为 YUV420SP,不支持 RGB888 输入。而摄像头同样也支持 YUV420SP。因此,如果要实现推流,使用 YUV420SP 格式是最好的选择。请问您的具体需求是什么,为什么需要进行这样的转换?

def rgb_to_yuv(rgb):
    """
    将单个RGB颜色值转换为YUV颜色值。

    参数:
    rgb: tuple
        输入的RGB颜色值,范围为[0, 255]。

    返回:
    tuple
        转换后的YUV颜色值,范围为:
        Y [0, 255], U [-128, 127], V [-128, 127]。
    """
    # 转换RGB值为[0, 1]范围
    r = rgb[0] / 255.0
    g = rgb[1] / 255.0
    b = rgb[2] / 255.0

    # 应用转换公式
    y = 0.299 * r + 0.587 * g + 0.114 * b
    u = -0.14713 * r - 0.28886 * g + 0.436 * b
    v = 0.615 * r - 0.51499 * g - 0.10001 * b

    # 将YUV转换为常用范围
    y = round(y * 255)
    u = round(u * 255)
    v = round(v * 255)

    return (y, u, v)

我希望在摄像头捕获到的图像上面画图,但是直接在Yuv420格式的图片上画图会异常,所以我需要先转为rgb888,再绘制完我想要的图形后再转回Yuv420

当亮度(Y)和色度(UV)分量的内存地址连续时,img(yuv420sp) 可以正常绘制文本。在摄像头获取的 1280x720 分辨率下,亮度和色度的内存地址是连续的。以下是修改摄像头分辨率的代码示例:

stream_venc_test("/sdcard/examples/test.264", 1280, 720)