OpenCV 插件
1. 介绍
本代码仓插件实现了opencv的抠图和缩放功能。 抠图: 支持根据目标检测的(x,y)坐标和(width,height)宽高进行图像裁剪(抠图)。 缩放: 对解码后的YUV格式以及BGR格式的图像进行指定宽高的缩放。
1.1 支持的产品
本项目支持x86_64 Atlas 300I (型号3010) 和 arm Atlas 300I (型号3000)。
1.2 支持的版本
| Vision SDK版本 | CANN版本 | Driver/Firmware版本 |
|---|---|---|
| 26.0.0 | 9.0.0 | 26.0.RC1 |
1.3 软件方案介绍
本项目包含两个功能,即抠图与缩放。
1.3.1 抠图
整体业务流程为:待检测图片通过 appsrc 插件输入,然后使用图像解码插件 mxpi_imagedecoder 对图片进行解码,再通过图像抠图插件 OpenCVPlugin进行将图片抠图(其前后可接其他插件)。最后通过输出插件 appsink 获取结果,并在外部进行可视化,将结果标记到原图上,本系统的各模块及功能描述如表1所示:
表1 系统方案各模块功能描述:
| 序号 | 子系统 | 功能描述 |
|---|---|---|
| 1 | 图片输入 | 获取 jpg 格式输入图片 |
| 2 | 图片解码 | 解码图片 |
| 3 | 其他插件 | 其他插件的功能 |
| 4 | 抠图 | 对输入图片进行抠图 |
| 5 | 其他插件 | 其他插件的功能 |
| 6 | 结果输出 | 获取检测结果 |
| 7 | 结果可视化 | 将结果保存 |
1.3.2 缩放
整体业务流程为:待检测图片信息经预处理后通过 appsrc 插件输入,然后使用图像解码插件 mxpi_imagedecoder 对图片进行解码,再通过图像缩放插件 OpenCVPlugin进行对图片进行缩放(其前后可接其他插件)。最后通过输出插件 appsink 获取检测结果,并在外部进行可视化,将结果标记到原图上,本系统的各模块及功能描述如表2所示:
表2 系统方案各模块功能描述:
| 序号 | 子系统 | 功能描述 |
|---|---|---|
| 1 | 图片输入 | 获取 jpg 格式输入图片 |
| 2 | 图片解码 | 解码图片 |
| 3 | 其他插件 | 其他插件的功能 |
| 4 | 缩放 | 对输入图片进行缩放 |
| 5 | 其他插件 | 其他插件的功能 |
| 6 | 结果输出 | 获取检测结果 |
| 7 | 结果可视化 | 将结果保存 |
1.4 代码目录结构与说明
本工程名称为OpenCVPlugin,工程目录如下所示:
.
├── image
│ ├── pipeline.jpg
├── OpenCVPlugin
│ ├──lib (编译后生成)
│ ├──src
│ │ ├──OpenCVPlugin
│ │ ├── CMakeLists.txt
│ │ ├── OpenCVPlugin.cpp
│ │ └── OpenCVPlugin.h
├── python
│ ├── main.py
│ └── test.pipeline
├── build.sh
└── README.md
1.5 技术实现流程图
OpenCVPlugin 插件流程图。

1.6 适用场景
输入:metadata(数据类型“MxpiVisionList”) 输出:metadata(数据类型“MxpiVisionList”)
静态输入:{"image/yuv","image/rgb"} 静态输出:{"image/rgb"}
2 环境依赖
推荐系统为ubuntu 18.04,环境依赖软件和版本如下表:
| 软件名称 | 版本 |
|---|---|
| cmake | 3.5+ |
| python | 3.11 |
确保环境中正确安装Vision SDK。
在编译运行项目前,需要设置环境变量:
Vision SDK 环境变量:
. ${SDK-path}/set_env.sh
CANN 环境变量:
. ${ascend-toolkit-path}/set_env.sh
- 环境变量介绍
SDK-path: Vision SDK 安装路径
ascend-toolkit-path: CANN 安装路径
3 属性介绍
3.1 抠图功能的pipeline属性
| 序号 | 属性 | 描述 | 是否为必选项 | 是否可修改 |
|---|---|---|---|---|
| 1 | option | 插件功能选择,此处使用"crop" | 是 | 是 |
| 2 | startRow | 抠图选定区域的开始纵坐标, 默认为"0",取值为0~原图高 | 否 | 是 |
| 3 | startCol | 抠图选定区域的开始横坐标, 默认为"0" ,取值为0~原图宽 | 否 | 是 |
| 4 | Height | 抠图选定区域的高,默认为"256" ,取值为1~原图高,且必须为2的倍数 | 否 | 是 |
| 5 | Width | 抠图选定区域的宽,默认为"256" ,取值为1~原图宽,且必须为16的倍数 | 否 | 是 |
| 6 | outputDataFormat | 插件输出的数据格式,可选值为"RGB" "BGR" "YUV" | 是 | 是 |
| 7 | dataType | 插件输出的数据类型,可选值为"uint8"和"float32",默认为“uint8” | 否 | 是 |
注:如果抠图的尺寸大于原图尺寸,插件会补边,出现绿色边框。
3.2 缩放功能的pipeline属性
| 序号 | 属性 | 描述 | 是否为必选项 | 是否可修改 |
|---|---|---|---|---|
| 1 | option | 插件功能选择,此处使用"resize" | 是 | 是 |
| 2 | height | 缩放后的高度, 默认为"256",取值为1~8192,必须为2的倍数 | 否 | 是 |
| 3 | width | 缩放后的宽度, 默认为"256",取值为1~8192,必须为16的倍数 | 否 | 是 |
| 4 | fx | width方向缩放比例,默认为"0",取值为0~1 | 否 | 是 |
| 5 | fy | height方向缩放比例,默认为"0",取值为0~1 | 否 | 是 |
| 6 | interpolation | 图片插值方式,默认为"1",取值为0~4 | 否 | 是 |
| 7 | outputDataFormat | 插件输出的数据格式,可选值为"RGB" "BGR" "YUV" | 是 | 是 |
| 8 | dataType | 插件输出的数据类型,可选值为"uint8"和"float32",默认为“uint8” | 否 | 是 |
注:fx和fy参数在height与width参数被赋值时失效,如有需要,可自行更改插件代码中resize部分。
插值方式的取值具体描述:
| interpolation选项 | 插值方式 | int值 |
|---|---|---|
| INTER_NEAREST | 最近邻插值 | 0 |
| INTER_LINEAR | 双线性插值(默认) | 1 |
| INTER_CUBIC | 基于4*4像素领域的3次插值法 | 2 |
| INTER_AREA | 使用像素区域关系进行重采样 | 3 |
| INTER_LANCZOS4 | 8x8像素邻域的Lanczos插值 | 4 |
4. 编译与运行
步骤1 修改CMakeLists.txt文件
第15行 将“/usr/local/Ascend/ascend-toolkit/latest/runtime/include”替换为实际include路径。
步骤2 编译
进入到主路径:
bash build.sh
步骤3 运行
在main.py所在目录上传图片命名为"person.jpg",可通过修改pipeline文件选择相应的功能。
python3 main.py
注:插件输出宽高分别需要16、2对齐。 插件使用YUV格式输出时,将main.py 87、89、91行保持注释;94、95行注释打开。 同时将下游插件的"cvProcessor"属性删除。 插件使用RGB格式输出时,将main.py 87、89行注释打开;91、94、95行保持注释。 插件使用BGR格式输出时,将main.py 87、91行注释打开;89、94、95行保持注释。 插件输出为float32格式时,打开85行,注释86行。 插件输出为uint8时,打开86行,注释85行。