linux下实现Python调用海康威视SDK

---作者吴疆,未经允许,严禁转载,违权必究---

---欢迎指正,需要源码和文件可站内私信联系---

-----------点击此处链接至博客园原文-----------

 

功能说明:将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是一款集成开发环境,在此使用主要是考虑到其方便添加各种库路径,执行以下命令:

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值