摘要: 本文介绍在睿擎(RuiChing)RK3506 平台上移植使用 OpenCV 开源软件包,并结合 ncnn 推理框架部署 YOLO 模型,实现光伏组件红外图像故障检测的完整方案。文中以实际工程代码为主线,依次讲解红外图像残差增强算法与 YOLO 缺陷检测推理的实现过程。
一、OpenCV 与 ncnn 框架概述
OpenCV,全称 Open Source Computer Vision Library,是一款跨平台的开源计算机视觉库,提供图像读写、滤波、形态学、特征提取等数千个经过优化的算法实现,被广泛应用于工业检测、医学影像、机器人视觉等场景。OpenCV 采用模块化架构,嵌入式场景下可按需裁剪——本方案使用 core、imgproc、highgui 三个模块,即可覆盖从图像读入到增强输出的全部处理需求。
ncnn 是腾讯开源的高性能神经网络推理框架,专为移动端与嵌入式设备的 CPU 推理而设计:纯 C++ 实现、无第三方依赖,并针对 ARM 平台进行了深度的 NEON 指令集优化。在缺少 NPU 的嵌入式 SoC 上,ncnn 是目前部署 YOLO 类检测模型最为成熟的方案之一。
本文讨论的实施场景为:在睿擎工业平台(Rockchip RK3506)上处理光伏组件的红外巡检图像。RK3506 采用 3× Cortex-A7的多核异构架构,未集成 NPU,推理任务只能由 CPU 承担。方案目标有二:一是通过 OpenCV 残差增强,将红外图像处理为「背景全黑、故障高亮」的效果图,辅助人工目视检查;二是通过 ncnn 部署 YOLO 模型,自动框出热斑、电池片断裂、底部积灰、杂物遮挡、接线盒过热、子串断路共 6 类缺陷并标注置信度。两个功能均落地为 MSH 串口命令,图像从本地文件系统读取、结果写盘输出。
二、整体处理流水线
在讨论具体实现之前,需要首先建立对整体数据流水线的清晰认知——从本地图像文件读入,到增强结果与检测结果写盘输出,数据经过了哪些组件、完成了哪些阶段的处理。下图以框图形式展示了这一流水线的整体架构。

三、红外图像残差增强的实现
3.1 算法原理
红外故障图像中,故障区域表现为局部高温亮斑,而大面积正常区域构成缓慢变化的背景温度分布。残差增强的基本思想是:首先估算背景温度分布,再用原图减去背景,所得残差即对应故障区域。完整流程分为五步:
1. 大核高斯模糊:用大尺寸高斯核(默认 51×51)对原图滤波,局部热点被抹除,得到平滑的背景估计 bg;
2. 残差计算:diff = src - bg,故障区域残差为正,正常区域接近零或为负;
3. 负值截断:仅保留正残差,即「比背景热」的区域;
4. 归一化:将残差线性拉伸至 [0, 255],背景对应 0(纯黑),最强故障对应 255(最亮);
5. 去噪与区域连接:小阈值清除背景噪点,形态学闭运算连接邻近故障区域。
最终输出的图像背景全黑、故障区域高亮,便于目视检查,也可作为后续检测的预处理结果。
3.2 命令入口与参数解析
函数通过 argc/argv 接收命令行参数,输入输出路径与算法参数均提供默认值,高斯核尺寸强制为奇数以满足 GaussianBlur 的要求:
staticintinfrared_residual_enhance(int argc, char *argv[]){ const char *input_path =
3.3 图像读取
红外图像本质上是单通道温度数据,因此以灰度模式读入,既节省内存又符合算法前提。imread 失败时返回空 Mat,必须判空处理:

3.4 背景温度估计
使用大核对原图做高斯模糊,局部热点被滤波抹除,输出即为平滑的背景温度分布。核越大,背景估计越粗,小尺度热点越不容易泄漏到背景中:
3.5 残差计算与负值截断

这里的关键点是必须先通过 convertTo 将图像转换为 32 位浮点类型再执行减法。若直接对 8 位无符号图像做减法,负值会在 uchar 类型上发生回绕,导致结果错误。
3.6 归一化、去噪与形态学处理

NORM_MINMAX 归一化将当前最大残差映射为 255、最小值映射为 0;THRESH_TOZERO 将低于阈值的像素清零而保留其余像素,用于抑制背景噪点;3×3 椭圆结构元的闭运算则把因噪声断开的邻近亮斑连接为完整区域。
3.7 结果输出与命令注册

运行效果如下:
msh />infrared_residual_enhance /data/ir_input.jpg /data/ir_enhanced.jpg 51 5[IR] loaded /data/ir_input.jpg, size: 640x512, kernel=51, thr=5[IR] Success: /data/ir_enhanced.jpg (black bg + bright faults)
(左为原始红外图像,右为残差增强结果)
3.8 参数调节建议
kernel(默认 51):决定背景估计的空间尺度。点状小目标宜用大核,避免热点泄漏进背景;成片的大范围过热区域宜用小核,否则故障会被当作背景扣除;
noise_thr(默认 5):决定残差多强才判定为故障。取值过高会遗漏弱小故障,过低则背景噪点会形成伪亮斑,建议从默认值开始逐步微调。
四、YOLO 缺陷检测推理的实现
4.1 模型转换与部署
检测模型用于识别光伏红外图像中的 6 类缺陷:热斑(hotcell)、电池片断裂(break)、底部积灰(bottomdirt)、杂物遮挡(debriscover)、接线盒过热(junctionboxheat)、子串断路(substringopencircuit)。
模型的部署链路为:训练得到的 .pt 权重 → 导出 ONNX → 使用 ncnn 工具链转换为 .param(网络结构)与 .bin(权重)两个文件,随后拷贝至开发板 SD 卡即可。
4.2 模型加载

use_vulkan_compute 必须置为 false,RK3506 不具备可用的 GPU 计算后端。
4.3 图像预处理
预处理必须与模型训练时的输入处理严格一致。from_pixels_resize 在一步内完成 BGR 到 RGB 的转换与缩放;mean 取 0、norm 取 1/255,等价于将像素值归一化至 [0, 1]:

4.4 网络推理

in0、out0 为模型导出时的输入输出节点名,不同模型的节点名可能不同,可使用 Netron 打开 .param 文件确认。本模型实际打印的输出维度为 8400 10 1,即 8400 个候选框,每个候选框包含 10 个数值:4 个坐标参数(cx, cy, w, h)与 6 个类别分数。
4.5 输出解码

解码逻辑为:对每个候选框取分数最高的类别,置信度超过 0.25 阈值的予以保留。需要注意,模型输出的坐标基于 640×640 的输入尺寸,必须乘以 scale_x/scale_y 才能还原到原图坐标系。
4.6 NMS 去重
同一故障通常会被多个候选框同时命中,因此按置信度降序排列后执行非极大值抑制(NMS),IoU 超过 0.45 的重叠框仅保留最优者:

4.7 结果绘制与输出

绘制使用 OpenCV 完成:rectangle 绘制检测框,putText 标注类别与置信度,字体尺寸随图像分辨率自适应,最终结果通过 imwrite 写入。
4.8检测结果展示
实际检测效果如上图所示。左图为原始红外图像的检测结果:YOLO 模型在组件下部区域检出 1 处热斑(hotcell),置信度 82.0%,检测框位置与图像中的实际高温区域吻合。右图为同一张图像经残差增强后的检测结果:模型在相同位置检出热斑,置信度为 82.6%。
从这组对比可以得出两点结论:其一,残差增强未改变故障区域的空间位置与相对强弱关系,增强后的图像仍能被模型正确识别;其二,增强操作将背景压为纯黑,抑制了背景温度起伏的干扰,置信度由 82.0% 小幅提升至 82.6%。
五、总结
本文围绕睿擎工业平台完成了从框架移植到算法落地的完整闭环。在框架层面,OpenCV 在仅有 128MB 内存的 RK3506 上稳定运行,ncnn 以纯 CPU 方式承担了 YOLO 推理任务,两者均以 MSH 命令的形式融入 RT-Thread 的交互调试体系;在算法层面,残差增强通过「背景估计—残差提取—归一化—形态学连接」的处理流程实现了故障区域的黑底高亮,YOLO 检测链路则完成了预处理、推理、8400 候选框解码、NMS 与结果标注的全流程。实测中,模型对热斑缺陷的检出置信度达到 82.0%,增强图像二次推理的置信度进一步提升至 82.6%,初步验证了“先增强、再识别流程”的可行性。
评论区
登录后即可参与讨论
立即登录