cv_lite 模块
概述
cv_lite 模块是针对某些特定任务、在底层基于 OpenCV 实现的轻量图像处理模块,提供了一些常见任务的加速版本方法,作为 openmv 的 image 模块中方法的补充。需要注意的是,它并不是完整的 OpenCV 库,仅提供部分任务的加速版本。
针对 cv_lite 模块中常见的数据格式,这里给出说明:
- 输入数据格式:
ulab.numpy.ndarray类型,一般通过image.to_numpy_ref()获取。 - ndarray 转回 image 实例:一般使用
img = image.Image(image_width, image_height, image.GRAYSCALE, alloc=image.ALLOC_REF, data=np_data)实现,构造时需注意 image 类型与数据量是否匹配。 - 零拷贝:上面两条操作没有重新分配内存,使用的是同一块物理内存,因此耗时不长。
- 与 openmv 混合使用:rgb888 格式数据若要和 openmv 的
image模块混合使用,可以使用to_rgb565()将其转换后再使用。
cv_lite 介绍
在前面的图像处理案例中,处理流程都是基于 openmv 移植实现的,大家可以发现部分案例的速度并不是很快。
为此,CanMV K230 官方针对某些特定场景提出了 cv_lite 的概念:针对某些特定任务在底层基于 OpenCV 实现轻量图像处理模块,提供常见任务的加速版本方法,作为 openmv 的 image 模块中方法的补充。
原理
cv_lite 的核心思路是:用底层 OpenCV 的 C/C++ 实现替换部分 MicroPython 层的处理逻辑,并通过零拷贝的内存共享在 openmv 的 image 对象与 ulab.numpy 数组之间高效传递数据,从而在保留 openmv 易用接口的同时获得接近原生 OpenCV 的处理速度。可从以下几个层面理解。
算法层:基于 OpenCV 的高效实现
openmv 的 image 模块默认以 RGB565 格式存储图像,其 find_blobs、find_circles、find_rectangles、find_edges 等方法在 MicroPython 环境下调用时会引入额外开销。cv_lite 则在底层直接调用 OpenCV 中经过长期优化(向量化、SIMD 等)的算法实现,例如:
find_blobs:基于连通域分析(Connected Components);find_circles:基于霍夫圆变换(Hough Circles);find_rectangles:基于轮廓提取与多边形拟合;find_edges:基于 Canny / Sobel 边缘检测;- 形态学操作、滤波、白平衡、直方图统计等同样复用 OpenCV 对应函数。
因此在同一任务上,cv_lite 通常能获得更高的帧率(详见下文“速度对比”)。