20200411更新:
经过评论区 @鹤汀凫渚 的指导,我成功的用最简单的方法在python中调用到了GPU加速后的函数,这里把这位朋友的评论贴出来供各位参考:
以下原文:
本文的核心目的就是加速,在实时图像处理的路上,没有什么比得上加速,速度足够快就能上更复杂的模型,速度足够快就能有更多的预处理,总之,加速就是一切。
为了弥补Opencv-Python接口没有cuda加速的缺陷,本文旨在通过调用C++上才有的cuda模块,对Opencv进行加速,然后将其打包为Python接口后调用。
ps:本来笔者最开始采用的是Cython的第三方解决方案,但是经过同事指教后发现官方的API更加明晰,故改回使用Python官方的API来完成。
目录:
- 图像数组的跨平台传递。
- 在C++下编写cuda加速的OpenCV代码。
--------------------------------------------------------------------------------
图像数组的跨平台传递
在采用PyTorch或者TF等深度学习框架的项目中,OpenCV主要的工作是针对图像的预处理,因此绝大部分情况下,数据的IO都是通过Python进行的,如何将图像数据从Python跨平台传输到C++下就是我们首先要解决的问题,而在Python下的图像数据基本都是保存为ndarray类型,因此我们需要在C++下也同样引入Numpy库,这个库可以通过APT直接安装,头文件会与Python3的头文件放在一起。
本文主要涉及的C++第三方库包括:
- OpenCV
- Numpy
- Python3.6
代码逻辑为:
- 接收来自Python的ndarray数组,将其转为PyArrayObject类
- 将PyArrayObject转为OpenCV的Mat类数据
- 调用OpenCV对Mat进行图像处理,本文为了演示仅做BGR2GRAY处理
- 将处理后的Mat转换为PyArrayObject类
- 将PyArrayObject传回给Python,Python会自动将其识别为ndarray类对象
为了完成上面的逻辑,我们需要新建三个类文件:
- interface.cpp/.h :接口类,主要负责步骤1,5
- conversion.cpp/.h :转换类,主要负责步骤2,4
- process.cpp/.h :处理类,主要负责步骤3
先从interface.cpp文件开始:
//interface.cpp
然后是conversion.cpp:
//conversion.cpp
最后是process.cpp:
//process.cpp
最后给出setup.py文件:
from
通过Python3 setup.py install build_ext --inplace命令就可以将包安装进Python3中