摘要: 本文介紹在睿擎(RuiChing)RK3506 平臺上移植使用 OpenCV 開源軟件包,并結合 ncnn 推理框架部署 YOLO 模型,實現光伏組件紅外圖像故障檢測的完整方案。文中以實際工程代碼為主線,依次講解紅外圖像殘差增強算法與 YOLO 缺陷檢測推理的實現過程。
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 串口命令,圖像從本地文件系統讀取、結果寫盤輸出。
在討論具體實現之前,需要首先建立對整體數據流水線的清晰認知——從本地圖像文件讀入,到增強結果與檢測結果寫盤輸出,數據經過了哪些組件、完成了哪些階段的處理。下圖以框圖形式展示了這一流水線的整體架構。

紅外故障圖像中,故障區域表現為局部高溫亮斑,而大面積正常區域構成緩慢變化的背景溫度分布。殘差增強的基本思想是:首先估算背景溫度分布,再用原圖減去背景,所得殘差即對應故障區域。完整流程分為五步:
1. 大核高斯模糊:用大尺寸高斯核(默認 51×51)對原圖濾波,局部熱點被抹除,得到平滑的背景估計 bg;
2. 殘差計算:diff = src - bg,故障區域殘差為正,正常區域接近零或為負;
3. 負值截斷:僅保留正殘差,即「比背景熱」的區域;
4. 歸一化:將殘差線性拉伸至 [0, 255],背景對應 0(純黑),最強故障對應 255(最亮);
5. 去噪與區域連接:小閾值清除背景噪點,形態學閉運算連接鄰近故障區域。
最終輸出的圖像背景全黑、故障區域高亮,便于目視檢查,也可作為后續檢測的預處理結果。
函數通過 argc/argv 接收命令行參數,輸入輸出路徑與算法參數均提供默認值,高斯核尺寸強制為奇數以滿足 GaussianBlur 的要求:
static int infrared_residual_enhance(int argc, char *argv[]){ const char *input_path ="/data/ir_input.jpg"const char *output_path ="/data/ir_enhanced.jpg"int kernel = 51; /* 高斯核大小,奇數 */int noise_thr = 5; /* 噪聲閾值,0~255 */if (argc >= 2) input_path = argvif (argc >= 3) output_path = argvif (argc >= 4) kernel = atoi(argvif (argc >= 5) noise_thr = atoi(argvif (kernel % 2 == 0) kernel += 1; /* 高斯核必須為奇數 */
紅外圖像本質上是單通道溫度數據,因此以灰度模式讀入,既節省內存又符合算法前提。imread 失敗時返回空 Mat,必須判空處理:

使用大核對原圖做高斯模糊,局部熱點被濾波抹除,輸出即為平滑的背景溫度分布。核越大,背景估計越粗,小尺度熱點越不容易泄漏到背景中:


這里的關鍵點是必須先通過 convertTo 將圖像轉換為 32 位浮點類型再執行減法。若直接對 8 位無符號圖像做減法,負值會在 uchar 類型上發生回繞,導致結果錯誤。

NORM_MINMAX 歸一化將當前最大殘差映射為 255、最小值映射為 0;THRESH_TOZERO 將低于閾值的像素清零而保留其余像素,用于抑制背景噪點;3×3 橢圓結構元的閉運算則把因噪聲斷開的鄰近亮斑連接為完整區域。

運行效果如下:
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)
(左為原始紅外圖像,右為殘差增強結果)
noise_thr(默認 5):決定殘差多強才判定為故障。取值過高會遺漏弱小故障,過低則背景噪點會形成偽亮斑,建議從默認值開始逐步微調。
檢測模型用于識別光伏紅外圖像中的 6 類缺陷:熱斑(hotcell)、電池片斷裂(break)、底部積灰(bottomdirt)、雜物遮擋(debriscover)、接線盒過熱(junctionboxheat)、子串斷路(substringopencircuit)。
模型的部署鏈路為:訓練得到的 .pt 權重 → 導出 ONNX → 使用 ncnn 工具鏈轉換為 .param(網絡結構)與 .bin(權重)兩個文件,隨后拷貝至開發板 SD 卡即可。

use_vulkan_compute 必須置為 false,RK3506 不具備可用的 GPU 計算后端。
預處理必須與模型訓練時的輸入處理嚴格一致。from_pixels_resize 在一步內完成 BGR 到 RGB 的轉換與縮放;mean 取 0、norm 取 1/255,等價于將像素值歸一化至 [0, 1]:


in0、out0 為模型導出時的輸入輸出節點名,不同模型的節點名可能不同,可使用 Netron 打開 .param 文件確認。本模型實際打印的輸出維度為 8400 10 1,即 8400 個候選框,每個候選框包含 10 個數值:4 個坐標參數(cx, cy, w, h)與 6 個類別分數。

解碼邏輯為:對每個候選框取分數最高的類別,置信度超過 0.25 閾值的予以保留。需要注意,模型輸出的坐標基于 640×640 的輸入尺寸,必須乘以 scale_x/scale_y 才能還原到原圖坐標系。
同一故障通常會被多個候選框同時命中,因此按置信度降序排列后執行非極大值抑制(NMS),IoU 超過 0.45 的重疊框僅保留最優者:


繪制使用 OpenCV 完成:rectangle 繪制檢測框,putText 標注類別與置信度,字體尺寸隨圖像分辨率自適應,最終結果通過 imwrite 寫入。


實際檢測效果如上圖所示。左圖為原始紅外圖像的檢測結果: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%,初步驗證了“先增強、再識別流程”的可行性。
完整文檔、SDK 下載及配置指南,請訪問睿擎平臺文檔中心:
https://www.rt-thread.com/ruiching/document/site/
睿擎平臺,持續迭代,為工業開發加速。


