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. Cayley图数据库的可视化(Visualize)

    引入   在文章Cayley图数据库的简介及使用中,我们已经了解了Cayley图数据库的安装.数据导入以及进行查询等.   Cayley图数据库是Google开发的开源图数据库,虽然功能还没有Neo4 ...

  2. Elasticsearch简介与实战

    什么是Elasticsearch?   Elasticsearch是一个开源的分布式.RESTful 风格的搜索和数据分析引擎,它的底层是开源库Apache Lucene.   Lucene 可以说是 ...

  3. javascript小记五则:用JS写一个图片左右自由滚动的“跑马灯”效果

    之前看了很多百度搜索出的东西,十个有九个是不能实用的,个个讲的都不详细,今天详细给大家讲解下关于这个图片“跑马灯”滚动效果,源码如下: <!DOCTYPE html PUBLIC "- ...

  4. sql 修改、更新、替换 某个字段的部分内容(转载)

    来源:https://blog.csdn.net/jiangnanqbey/article/details/81304834 1*.需求 将表(Ws_FormMain)的字段(order_Number ...

  5. Mac下全局安装yarn

    sudo -s npm install -g yarn react-native-cli

  6. Jetty 开发指南: 嵌入式开发之HelloWorld

    Jetty 嵌入式之 HelloWorld 本节提供一个教程,演示如何快速开发针对Jetty API的嵌入式代码. 1. 下载 Jar 包 Jetty被分解为许多jar和依赖项,通过选择最小的jar集 ...

  7. 林业资源遥感航拍监测GIS系统

    航拍监测.遥感监测在林业有害生物(松材线虫病监测).森林防火监测.森林滥砍滥伐.林地侵占.林地违规开发监测等方面应用,将大大提升林业资源监测水平, 针对已有森林资源大量流失,滥砍滥伐现象普遍存在的事实 ...

  8. IM多类型holder封装

    如标题,这是一个在列表多类型视图时的一个简化封装方法,减少多余代码,提高复用性,更好迭代扩展,先看视图列表效果图 GitHub:https://github.com/1024477951/Fragme ...

  9. 微信小程序开发基础

    前言: 微信小程序开入入门,如果你有html+css+javascript的基础,那么你就很快地上手掌握的.下面提供微信小程序官方地址:https://developers.weixin.qq.com ...

  10. Django项目结构介绍

    官网下载网址:https://www.djangoproject.com/download/ 安装(安装最新LTS版): pip3 install django==2.0.7 创建一个django项目 ...