---作者吴疆,未经允许,严禁转载,违权必究---
---欢迎指正,需要源码和文件可站内私信联系---
-----------点击此处链接至博客园原文-----------
功能说明:将C++版的海康威视官方SDK封装、编译成动态共享对象(linux中称为DSO,Dynamic Shared Objects,windows中称动态链接库),供Python调用实现相关功能
运行环境:ubuntu14.04或ubuntu16.04、opencv2.4.13.5或opencv2.4.13.6、swig3.0.8、codeblocks16.01、Python2.7.6(仅在上述运行环境中验证过该博客有效性)
一、相关介绍
参考链接:swig扩展opencv Python调用C++(极重要参考)
本节主要介绍在linux系统下将C++源文件封装、编译为.so动态共享对象的大致流程和细节。swig是simplified wrapper and interface generator的缩写,是一个非常优秀的开源工具,支持将 C/C++代码与任何主流脚本语言相集成。其中,必须编写一个额外的接口文件(.i文件)来作为swig(终端工具)的入口。这里引用上文中(未调用opencv的简单)例子对该流程进行叙述。(若调用了opencv函数,则需利用opencv-swig接口文件,将在“四”中以例子形式介绍)
//example.hpp #ifndef example_hpp #define example_hpp #include <iostream> #include <vector> class Test{ public: Test(){ for(int i=0;i<10;i++) v.push_back(i); } void see(); private: std::vector<int> v; }; #endif
//example.cpp #include "example.hpp" #include <stdio.h> using namespace std; void Test::see(){ for(int i=0;i<(this->v).size();i++) printf("%d ",v[i]); }
example.i文件如下:
%module example %include "std_vector.i" %{ #include "example.hpp" %} %include "example.hpp"
其中,example.cpp为C++源文件,定义了相关函数方法;example.hpp是对应的头文件,里面还定义了要封装的函数方法;为了实现封装,编写了对应接口文件example.i。
example.i中第一行 %module后面的名字(example)是被封装的模块名称,Python通过这个名称来加载程序;第二行是该.i文件依赖的头文件,vector本来是STL里面的,但是swig已经有对应的"std_vector.i"写好了,所以可以直接include "std_vector.i";第三行至第五行大括号中包含了该.i文件需要的一些函数声明和头文件;最后一行是声明了要封装的函数和变量,由于函数声明写在了头文件里,如果需要全部封装可以直接%include 头文件名(example.hpp)。
现在,就可以利用swig封装代码,生成预编译C++文件.cxx和.py文件 执行命令 swig -python -c++ example.i (#将对应生成example.cxx :编译c++时用;example.py:python import包时使用)
接着,可以使用python内置的distutils库编译上述.cxx文件,该python脚本(setup.py)如下:
from distutils.core import setup,Extension setup(name = "example", version = "1.0", ext_modules = [Extension("_example", ["example_wrap.cxx", "example.cpp"], extra_compile_args = ['-std=c++11'])], py_modules=['example'])
执行命令 sudo python setup.py install (#注意模块名称_example前面一定要加下划线、这会将生成的_example.so 和 example.py 送到python对应的package文件夹),接着可以执行:
In [1]: from example import *
In [2]: x = Test()
In [3]: x.see()
0 1 2 3 4 5 6 7 8 9
大致上,封装C++函数、编译动态共享对象供Python调用就是这个过程,若涉及调用opencv等函数库,情况和处理更为复杂一些,将在后文“四”中以例子形式叙述。上述文件(百度云盘备份不对外提供)。
二、环境搭建之opencv安装方法
参考链接:linux下Python调用海康SDK实时显示网络摄像头、linux设置opencv环境变量、linux下QT环境搭建及opencv交叉编译(可不参考)
opencv通常采用源码编译安装,常见的可利用cmake-qt-gui交叉编译或cmake编译安装。本人ubuntu14.04工作站很早就利用cmake-qt-gui预装了opencv2.4.13.6,在这里叙述利用cmake编译安装opencv2.4.13的方法(在ubuntu16.04上验证过)。如果在安装opencv之前机器预装了高版本的cuda9.0(cuda9.0不再支持2.0架构),照此方法会出错,将在后文“五”中叙述报错内容及解决方法,没有安装过cuda或安装cuda8.0等低版本可以参考本节opencv安装方法。
首先,安装依赖包,执行以下命令:
#更新软件源
sudo apt-get update
#-y表示yes,build-essential、cmake等为一系列依赖包 sudo apt-get install -y build-essential cmake git libopencv-dev libgtk2.0-dev pkg-config libavcodec-dev libpng12-dev libavformat-dev libswscale-dev yasm libxine2 libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libqt4-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils sudo apt-get install -y libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff5-dev libjasper-dev libdc1394-22-dev
然后,网上下载opencv2.4.13压缩包文件(以opencv-2.4.13.6.zip为例),将压缩包拷贝到主文件夹(/home/rcnn ,rcnn为本人机器用户名),执行以下命令:
unzip opencv-2.4.13.6.zip cd opencv-2.4.13.6
#mkdir命令新建opencv-debug目录,用于存放编译后的文件
mkdir opencv-debug cd opencv-debug #精简版编译安装 cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local .. #或选择cuda版安装 cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_CUDA=ON -D ENABLE_FAST_MATH=ON -D CUDA_FAST_MATH=ON -D WITH_CUBLAS=1 -D WITH_NVCUVID=on -D CUDA_GENERATION=Auto .. make sudo make install
以上推荐使用精简版编译安装,安装路径设置为/usr/local(实际上编译安装后文件存在于opencv-debug下,但会复制头文件、库文件等到上述指定的路径中,如/usr/local/include/opencv2、 /usr/local/include/opencv、 /usr/include/opencv、 /usr/include/opencv2、 /usr/local/share/opencv、 /usr/local/share/OpenCV、 /usr/share/opencv、 /usr/share/OpenCV、 /usr/local/bin/opencv*、 /usr/local/lib/libopencv*
)。然后,配置环境变量:
#新建opencv配置文件,gedit与vim均为文本编辑工具 sudo gedit /etc/ld.so.conf.d/opencv.conf #在该文件中输入下句(依赖库路径)并保存关闭 /usr/local/lib #使配置生效 sudo ldconfig #打开bash并配置 sudo gedit /etc/bash.bashrc #在该文件中输入下句(opencv.pc路径,该文件维护了opencv的相关信息,包含libs、cflags等)并保存 PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH #更新系统库缓存 #source /etc/bash.bashrc
#更新数据库索引 #sudo updatedb
最后,可通过例子验证安装是否成功,具体可参考以上两个博客。上述文件(百度云盘备份不对外提供)。
三、环境搭建之swig和codeblocks
参考链接:linux下Python调用海康SDK实时显示网络摄像头、ubuntu源码安装swig(博客一)、ubuntu源码安装swig(博客二)
swig在上文“一”中已经介绍过,而codeblocks是一款集成开发环境,在此使用主要是考虑到其方便添加各种库路径,执行以下命令: