OpenCV 常见问题与排查思路
常见问题与排查思路
Q:imread 返回空 Mat。依次排查三件事:路径是否真实存在(含中文路径在一些构建下会出问题,尽量用绝对路径或先确认编码)、文件格式是否被当前构建支持(用 haveImageReader 判断)、编解码后端是否在交叉编译时被漏掉。三步都排除后再怀疑文件本身损坏。
Q:处理结果整体错行或花屏。几乎都是行步长假设错误。把 data[i*cols+j] 这类按连续内存寻址的写法全部改成 ptr<T>(y) 按行取指针;同时检查是否在不连续的 ROI 上直接做了整块内存操作。
Q:改了图像,原图也变了。这是浅拷贝语义导致的。Mat a = b; 与 Mat roi = img(rect); 都共享数据,需要独立像素就显式 clone()。
Q:模型推理结果与训练框架差很多。按顺序核对:通道序(BGR / RGB 是否与训练一致)、mean 与 scalefactor 的数值与顺序、缩放方式与是否做了 letterbox、输出张量的维度顺序与解码方式、NMS 阈值。任何一项不一致都会显著影响结果,且往往表现为「能检出来但位置或类别不准」这种不易察觉的偏差。
Q:怎么进一步减小端侧占用。先确认 BUILD_LIST 已经最小化,再关掉 highgui、java、python 绑定、测试与应用样例,然后按目标平台决定 WITH_OPENCL、WITH_TBB、WITH_IPP 的取舍;ARMv7 平台还可以通过工具链选项启用 NEON 与 VFPv3 这类 SIMD / 浮点能力来提升数值计算速度,aarch64 上 NEON 通常已是基线。各选项在不同版本中的默认值与可用性并不一致,动手前以官方文档为准。
Q:Python 与 C++ 该怎么分工。用 Python 做原型、参数扫描与可视化验证,用 C++ 做上板部署。关键是把预处理与后处理固化成两端各自唯一的一份实现,并保留同一组测试图做回归比对,这样迁移才不会变成一次重新调参。
把模块划分、cv::Mat 的内存语义、BGR 与 blob 的处理链这三件事搞清楚,OpenCV 的端侧部署就从「玄学调参」变成一条可以按清单执行的工程流程:选模块、编交叉、对齐预处理、验证后处理、固化配置。

