得益于 Raspberry Pi 等低成本硬件平台,现在比以往更容易在硬件上对图像处理算法进行原型验证。大多数图像处理算法需要进行大量计算,在嵌入式平台上以可接受的帧频运行它们非常困难。尽管 Raspberry Pi 在运行简单的图像处理算法时游刃有余,但大图像和复杂算法应在 NVIDIAJetson 等功能强大的硬件上运行。
本文将以色度键控效果为例,介绍在嵌入式硬件上部署 MATLAB 图像处理算法的简单工作流。我们将使用 MATLAB Coder 通过算法生成C代码,然后使用在硬件上运行的实用程序在 Raspberry Pi 板卡上进行算法原型验证。最后,我们将算法移植至 NVIDIA Jetson Tx1 平台以保证实时性能。
色度键控算法
色度键控广泛用于电视天气预报、电影制作和图片编辑应用程序,它是一种视频处理技术,首先针对单色背景(如绿色屏幕)拍摄前景对象,然后用不同场景(图1)替换该背景。
图1:应用色度键控之前和之后的示例
色度键控算法将图像中的每个像素与代表单背景色的基准色进行对比。如果像素颜色与基准色足够接近,像素将由之前所选场景图像的对应像素替换。从数学上讲,色度键控算法采用以下公式:
其中代表进行色度键控后位置 (j,k) 处的最终像素值,是与原始图像对应的像素值,是代表替换单一背景色的场景的像素值,m(j,k)∈[0,1] 是掩码值。掩码数值 m(j,k) 对于前景像素应该为 1,对于背景像素应该为 0。0 与 1 之间的掩码值可提供从背景到前景的平滑过渡。
每个像素的掩码值通常在 YcbCr 颜色空间而不是普通的 RGB 颜色空间中进行计算。YcbCr 图像的 Y 分量代表亮度分量,用于确定图像的明暗度。Cb 和 Cr 分量代表色度分量,用于衡量与基准色的相似度。由于仅使用图像的 Cb 和 Cr 分量衡量颜色相似度,该算法在应对单一背景色明暗区域的亮度值差异时十分稳健。
为衡量像素色与基准色的相似性,我们在色度空间中使用欧氏距离平方:
最后,使用以下公式计算图像中位置 (j,k) 的掩码值:
其中 t1 和 t2 ( t2 > t1)代表要确定的阈值。
MATLAB实现
以下是色度控键算法的 MATLAB 实现:
在 MATLAB 中,图像由类型 uint8 的 [N,M, 3] 数组表示。这表示,在执行数学操作前,我们需要将图像数据类型转换为 “double”。为避免背景到前景的快速突变,我们对算出的掩模采用高斯过滤器进行滤波。
确定基准色和阈值
色度键控算法需要基准色和阈值。使用 MATLAB Raspberry Pi 支持包中的相机接口,我们拍摄了实际场景的图像。随后,我们可以凭借经验确定背景的适用基准色和相应的阈值。
img = snapshot(cam); 命令绘制 MATLAB 中 Raspberry Pi 相机拍摄的图像。我们使用 MATLAB 绘制中的 Data Cursor 工具指定背景颜色(图2)。
图2:MATLAB 中用于确定背景色值的 Data Cursor 工具
要确定阈值,我们将循环运行算法并调整阈值:
当运行代码时,我们会获得带有所选背景的图像(图3)。
图3:左:原始图像;右:运行色度控键算法后获得的图像
将色度键控算法部署到 Raspberry Pi
在部署代码前,我们需要编写一段包含有色度键控算法的循环体,循环体中还包括从相机拍摄图像,并在 Raspberry Pi 连接的显示器上显示:
matlab.raspi.webcam 和 matlab.raspi.SDLVideo Display 是在硬件上运行实用程序的 System objects,它们可简化部署工作流程中相机的使用和 Raspberry Pi 显示。要编译并运行代码,我们可执行以下命令:
runOnHardware 功能会为 Raspberry Pi 硬件创建 MATLAB Coder 配置,为 chromaKeyApp.m 生成代码并对其部署。为了以合理的帧频运行算法,图像大小可缩小到 640x480 或 320x240。
生成GPU代码
算法在 Raspberry Pi 上运行,但是它不会实现我们需要的实时性能。为了加快算法的速度,我们要使用 GPU Coder 将其部署到 NVIDIA Jetson 平台。我们需要生成 GPU 代码以利用算法中的内在并行性。首先,我们会编写 main 函数进行封装,以利用 OpenCV 访问连接到 NVIDIA Jetson 的 USB 相机。此功能将视频帧从相机送到我们的 chromaKey 算法,随后在屏幕上显示输出内容。
生成 GPU 代码后,我们首先创建 GPU Coder 配置对象、设置 GPU 参数以指向 NVIDIA Jetson 硬件平台,然后加入自定义的 main 函数。我们不会在 MATLAB 主机上编译代码,因为我们将专门为 NVIDIA Jetson 平台生成代码。我们将创建脚本来设置 GPU Coder 配置、输入示例数据,并为我们的应用生成源代码。
我们随后在 MATLAB 中运行脚本为 chromaKey 算法生成 CUDA 代码。
向 NVIDIA Jetson 部署绿屏算法
要向 NVIDIA Jetson 部署生成的代码,我们需要使用以下 MATLAB 命令将全部所需文件打包到 codegen 目录。
接下来,将生成的所有 codegen 文件夹从主机复制到 NVIDIA Jetson 控制板。在传输文件后,我们直接登录到 NVIDIA Jetson 以构建并运行应用程序。
登录到 NVIDIA Jetson 后,我们运行 NVIDIA 提供的 jetson_clocks.sh 脚本以将平台性能最大化、切换到包含生成的源代码(之前传输)的 codegen 目录,然后执行以下显示的编译命令。
在可执行程序(chromaKey)Build 后,使用 NVIDIA Jetson 控制台上的 USB 网络摄像头通过以下命令运行应用程序。每秒显示帧数将显示在输出窗口中。
图 4 显示出现绿屏效果前后 NVIDIA Jetson 板卡的 USB 相机的输出内容。
图4:应用绿屏效果前后的示例
Raspberry Pi 和 NVIDIA Jetson 性能对比
NVIDIA Jetson 上 GPU 更加强大的并行处理能力极大地提高了算法的性能。Raspberry Pi 实现了约 1 帧/秒的帧频,而 NVIDIA Jetson 对于 1280x720 大小的图像实现了 20 帧/秒以上的帧频。也就是说,无需对算法进行任何修改或优化,我们便获得了 20 倍以上的加速。通过优化 MATLAB 算法提高 GPU 代码的生成效率,我们可以实现更高的性能。
全部0条评论
快来发表一下你的评论吧 !