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 安装 MySQL 8,并减少内存占用 记录

    目前vps 1cpu 512m内存 MySQL内存占用77% ,约350m ,经过修改配置文件优化后如下 $ ps aux 进入docker bash $ docker exec -it pwc-my ...

  2. mysql 设置自增主键id的起始值

    修改user表,主键自增从20000开始 alter table user AUTO_INCREMENT=20000;

  3. 最新阿里Java技术面试题,看这一文就够了!

    金三银四跳槽季即将到来,作为 Java 开发者你开始刷面试题了吗?别急,小编整理了阿里技术面试题,看这一文就够了! 阿里面试题目目录 技术一面(基础面试题目) 技术二面(技术深度.技术原理) 项目实战 ...

  4. C# xml序列化与反序列化 特性的使用

    以下为将被序列化的类Entity: [XmlRoot("Root")] public class Entity { [XmlAttribute(AttributeName = &q ...

  5. [转]当CPU飙高时,它在做什么

    在开发过程中,有时候我们发现JVM占用的CPU居高不下,跟我们的预期不符,这时,CPU在做什么呢?是什么线程让CPU如此忙碌呢?我们通过如下几步,可以查看CPU在执行什么线程. 1.查找jvm进程ID ...

  6. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  7. odoo 12企业版与免费社区版的区别,价格策略与技术支持指南的全面解析

    Odoo / Ps Cloud收费企业版是对社区版的极大增强,除了增加了很多功能外,最大的功能区别是企业版支持条码而社区版不支持,企业版对手机支持更好.有单独的APP,最重要区别的是企业版提供底层技术 ...

  8. 在 asp.net core 中使用类似 Application 的服务

    在 asp.net core 中使用类似 Application 的服务 Intro 在 asp.net 中,我们可以借助 Application 来保存一些服务器端全局变量,比如说服务器端同时在线的 ...

  9. 在cmd里,java运行jar包中指定Class的命令

    java -classpath ****.jar ****.****.className

  10. 从0开始的Python学习019更多的Python内容2

    书接上文,接演Python全传 话说学了这么多Python的基础知识,也该写一点让别人看不懂的代码了. lambda lambda表达式,是一个方法的简化形似,它没有自己的代码块,它后面的语句就是它的 ...