osx:10.12 g++ 7.1 swig 3.0.12 opencv 3.2.0

SWIG是Simplified Wrapper and Interface Generator的缩写。是Python中调用C代码的另一种方法。在这个方法中,开发人员必须编写一个额外的接口文件来作为SWIG(终端工具)的入口

SWIG在官网上有很详细的例子这里就只针对opencv进行讲述

安装SWIG

brew install swig

这里用一个小例子来先简单介绍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]);
}

如何将这个类以及这个类的方法放在python里面调用呢

1.编写转换规则 example.i(接口文件)

%module example
%include "std_vector.i"
%{
#include "example.hpp"
%}
%include "example.hpp"

第一行 %module后面的名字是被封装的模块名称,Python通过这个名称来加载程序。

第二行是文件所以依赖的头文件,vector本是STL里面的,但是SWIG已经有对应的"std_vector.i"写好了,所以可以直接%include "std_vector.i",如果在python里面需要用到vector的话,在转换规则里面还要添加模版类型,具体参考SWIG的DOC http://www.swig.org/Doc1.3/Library.html

大括号里面所添加的内容,一般包含此文件需要的一些函数声明和头文件。

最后一行是声明了要封装的函数和变量,因为函数声明写在了头文件里面,如果全部封装的话可以直接%include 头文件名

2.封装代码,生成中间文件

swig -python -c++ example.i

这样会生成两个文件

example.cxx,example.py

example.cxx :编译c++时用

example.py:python import包时使用

3.使用distutils工具或命令编译

"""
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.so 和 example.py 送到python对应的package文件夹里

额外的参数和额外的库都跟着需要更改

4.Python引用

In [1]: from example import *
In [2]: x = Test()
In [3]: x.see()
0 1 2 3 4 5 6 7 8 9

注意的问题:

c++中声明的方法必须实现

GCC版本要和Python的底层版本一样

在编写接口文件的时候,需要将依赖的头文件都添加进来,而opencv里面的文件繁多,在Github上面有人已经写好了opencv.i

opencv-swig

安装方法:

没什么安装方法。。。下载文件直接将lib里面的文件复制到你Code的文件夹下面就好了。

使用方法在主页上有介绍

需要注意的是在写接口文件的时候,如果需要自己定义vector在python里面的接口,会出现redefinition的问题,因为作者写的借口文件里面已经实现过了vector的接口,不需要写,其他的STL类没有试过,出现redefinition时估计也是一样的问题。

作者没有写文档,在调用接口的时候需要去查作者的test,比如opencv里面的

cv::Mat ,在封装成python之后需要调用作者的module_name.Mat.from_array(img)转换成cv::Mat

参考文档:

http://blog.csdn.net/jiangpeng59/article/details/73554835

http://cering.github.io/2015/12/08/使用SWIG实现Python调用C-C-代码/

https://github.com/renatoGarcia/opencv-swig

http://www.swig.org/tutorial.html

http://www.swig.org/Doc1.3/Library.html

SWIG 扩展Opencv python调用C++的更多相关文章

  1. 如何实现Python调用C代码--python与C之间如何通信(swig)

    转载: https://www.zhihu.com/question/23003213 1. C代码如何调用Python 1.1 test #include <Python.h> int ...

  2. python调用Opencv库和dlib库

    python是一门胶水语言,可以调用C++编译好的dll库 python调用opencv-imggui.dll文件 https://www.cnblogs.com/zhangxian/articles ...

  3. Python调用OpenCV读显写

    OpenCV提供了python的接口,而且很重要的一点是python下的很多接口名与C++的接口名是一样的,这一篇先记录python调用OpenCV去读取图像.显示图像和保存图像. 1.OpenCV读 ...

  4. Python的扩展接口[3] -> Matlab引擎 -> 使用 Python 调用 Matlab 程序

    Python - Matlab 目录 Python-Matlab 引擎 Python-Matlab 数组 Python-Matlab 基本操作 Python-Matlab 调用 m 文件 Matlab ...

  5. Python的扩展接口[2] -> 动态链接库DLL[1] -> 组件对象模型 COM 的 Python 调用

    组件对象模型 COM 的 Python 调用 关于COM的基本概念,可参考组件对象模型 COM的内容,下面主要介绍两种使用 Python 调用 COM 组件的方法. 1 使用 win32com 1.1 ...

  6. python调用c\c++

    前言 python 这门语言,凭借着其极高的易学易用易读性和丰富的扩展带来的学习友好性和项目友好性,近年来迅速成为了越来越多的人们的首选.然而一旦拿python与传统的编程语言(C/C++)如来比较的 ...

  7. python调用C++之pybind11入门(相互调用)

    python调用C/C++有不少的方法,如boost.python, swig, ctypes, pybind11等,这些方法有繁有简,而pybind11的优点是对C++ 11支持很好,API比较简单 ...

  8. Python调用windows下DLL详解

    Python调用windows下DLL详解 - ctypes库的使用 2014年09月05日 16:05:44 阅读数:6942 在python中某些时候需要C做效率上的补充,在实际应用中,需要做部分 ...

  9. ESL python调用C模块时传递unicode字符串报错问题解决

    在是用freeswitch时利用ESL的python调用时传递字符串报错 TypeError: in method 'ESLconnection_api', argument 2 of type 'c ...

随机推荐

  1. Docker的介绍及安装

    什么是Dcoker? 引用度娘的解释:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 linux 机器上,也可以实现虚拟化.容器 ...

  2. Poj1799

    Yeehaa! Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15082   Accepted: 6675 Descript ...

  3. 文本三剑客---awk(gawk)基础

    gawk程序是Unix中原始awk程序的GNU版本.gawk程序让流编辑器迈上了一个新的台阶,它提供了一种编程语言而不只是编辑器命令.在gawk编程语言中,可以完成下面的事情: (1)定义变量来保存数 ...

  4. 微信小程序 canvas导出图片模糊

    //保存到手机相册save:function () { wx.canvasToTempFilePath({ x: , y: , width: , //导出图片的宽 height: , //导出图片的高 ...

  5. 第七课 路径与列表 html5学习2

    1.路径 一.相对路径1.同级路径2.下级路径 /3.上级路径 ../上一级路径 ../../上两级二.绝对路径 2.列表 列表特点;整齐.整洁.有序 一.无序列表语法格式<ul> < ...

  6. 三、Snapman多人协作电子表格之——软件的基本功能

    Snapman多人协作电子表格是一个即时工作系统. 一.SnapmanServer服务端 SnapmanServer服务端在安装Snapman软件一起自带,是一个小巧的控制台程序SnapmanServ ...

  7. 48.Odoo产品分析 (五) – 定制板块(3) – 修改文件和报告(1)

    查看Odoo产品分析系列--目录 不管ERP系统中的内置报表有多完善,大多数的公司仍然需要对文档和报表进行一些自定义的修改.  这一章节将介绍如何对报表的页眉和页脚做自定义修改:odoo框架如何组织报 ...

  8. 性能测试 基于Python结合InfluxDB及Grafana图表实时监控Android系统和应用进程

    基于Python结合InfluxDB及Grafana图表实时监控Android系统和应用进程   By: 授客 QQ:1033553122     1. 测试环境 2. 实现功能 3. 使用前提 4. ...

  9. 逻辑回归&线性支持向量机

    代码: # -*- coding: utf-8 -*- """ Created on Tue Jul 17 10:13:20 2018 @author: zhen &qu ...

  10. POJ 3085 - Quick Change

    Quick Change Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6288   Accepted: 4468 Desc ...