RK3588中的RGA模块进行图像的预处理测试耗时

653 阅读4分钟

关键词:RK3588、RGA、 NV12、 RGB、 BGR、 YUV

前言

  在RK3588 中OPENCV的应用虽然很便捷但是对资源消耗过高,这里的资源消耗主要是体现在对CPU以及运行内存(RAM)上。为了更高效利用RK3588系统资源,具有针对性优化常用的opencv常用的函数模块,这里我们选择使用RGA模块进行编译使用。在本文中我将为大家带来常见函数的测试记录供大家参考。

准备工作

  进行测试时需要准备一张生成的RGB图像,该图像的大小为1920 x 1080。这里我选择使用代码进行生成RGB图像,这样后面的实验可以轻松获取图像是RGB排列还是BGR排列以及对图像的大小尺寸能够明确知道。

生成图像代码:

import numpy as np
from PIL import Image

# 创建一个1920x1080的空白图像,每个像素为(0, 0, 0)表示黑色
width, height = 1920, 1080
image = np.zeros((height, width, 3), dtype=np.uint8)

# 设置RGB三原色
red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)

# 将图像分为三个区域,分别填充红色、绿色和蓝色
image[:height//3, :] = red
image[height//3:2*height//3, :] = green
image[2*height//3:, :] = blue

# 使用PIL库将NumPy数组转换为图像并保存
img = Image.fromarray(image)
img.save('rgb_image.png')

生成的图像: rgb_image.png

测试记录

  在本文中将介绍四个常用的转换函数:

  1. RGB格式数据转YUV格式数据(等同cv::cvtcolor);
  2. YUV格式数据转RGB格式数据(等同cv::cvtcolor);
  3. RGB格式数据修改大小(等同cv::resize);
  4. YUV格式数据修改大小(等同cv::resize);

这四个函数属于在边缘设备中使用频率较高的函数,例如对图像进行resize操作和RGB2YUV数据格式之间的互相转换。

RGB转NV12

  这是由于NV12占用内存是RGB的一半,在传输的过程中可以减少一半的带宽量,这一特性在推拉流中的应用是极其广泛的。

RGB数据: 1920x1080 占用内存为 (1920x1080x3) / 1024 = 6075KB
NV12数据: 1920x1080 占用内存为 (1920x1080x3/2) / 1024 = 3037.5KB

经过热启动后计算平均耗时为:4617us左右

image.png

image.png

NV12转RGB

  对NV12数据进行解码为RGB数据在显示传递的数据时是很重要的一个环节,或是在读取二进制数据后进行显示。

RGB数据: 1920x1080 占用内存为 (1920x1080x3) / 1024 = 6075KB
NV12数据: 1920x1080 占用内存为 (1920x1080x3/2) / 1024 = 3037.5KB

经过热启动后计算平均耗时为:3989us左右

image.png

image.png

RGB_RESIZE

  对于RGB格式的图像是面对处理最多的格式数据图像了,对RGB格式数据进行resize操作是必不可少的基础操作,这里我们对输入图像进行resize到640x480大小。

1920x1080数据: 1920x1080 占用内存为 (1920x1080x3) / 1024 = 6075KB
640x480数据: 640x480 占用内存为 (640x480x3) / 1024 = 900KB

经过热启动后计算平均耗时为:4617us左右

image.png

image.png

NV12_RESIZE

  NV12数据进行resize操作可以有效避免转为RGB进行resize 操作,例如在传输时仅需要对数据rezise操作,此时不需要转RGB后resize然后转NV12传输。

1920x1080数据: 1920x1080 占用内存为 (1920x1080x3/2) / 1024 = 3037.5KB
640x480数据: 640x480 占用内存为 (640x480x3/2) / 1024 = 450KB

经过热启动后计算平均耗时为:2861us左右

image.png

image.png