Python:SWIG编译C++接口

本文讲述了如何使用SWIG为C++库SeetaFaceEngine创建Python接口,特别是解决numpy.ndarray与OpenCV的cv::Mat之间的转换问题。在Ubuntu上安装SWIG和OpenCV,并编写.i文件来适配不同版本的OpenCV数据结构。文章总结了转换过程中遇到的问题,并提供了测试脚本和参考资料。
摘要由CSDN通过智能技术生成

问题来源

SeetaFaceEngine使用C++编译,而且使用OpenMP技术和向量化技术进行加速,已经基本可以满足业界对人脸识别功能的需求。在项目中用到人脸识别 功能,OpenCV自带的基于Haar特征的算法,效果不理想,仅仅能够识别正脸,人脸歪一定的角度都不能够识别。使用SeetaFaceEngine需要重新编译python接口,对于没有接触过的人来说还真不简单,在此新路记录。 SeetaFaceEngine源代码

SWIG

SWIG(Simplified Wrapper and Interface Generator)是一个为C/C++库提供脚本调用支持的工具,支持Lua, Perl, Python, Go等多种脚本语言。[1]中详细介绍了如何使用SWIG编写C/C++接口,很是详细。

安装

Ubuntu下使用sudo apt-get install swig就可以安装swig, 当然也可以下载源码进行安装 安装sudo apt-get install boost-dev,这是为了支持numpy.ndarray和cv::Mat的转化 安装OpenCV-2.4,最好从源代码进行编译安装,这个网上教程很多,就不说了

编写.i

%module pyfacedetect # 要生成的python模块的名称
%{
#define SWIG_FILE_WITH_INIT
#include <vector>
#include "crop_img.h"
%}
%include "crop_img.h"

numpy.ndarray和cv::Mat

首先需要明确的是opencv在C++和python中表示一张图片是不同的。直接进行测试就可以知道:

import cv2
img_file = "../img/1.jpg"
img = cv2.imread(img_file)
print type(img)

输出结果为: <type 'numpy.ndarray'> 而在C++中通过cv::Mat cv::imread(string filename, cv::IMREAD_GRAYSCALE);是直接返回cv::Mat类型的。因此,要想实现python调用原来的数据,需要实现一层数据结构的适配工作。网上的解决方案有很多,大部分人都没有说明opencv的版本,尤其是现在OpenCV 3.*版本已经日益普及,但是OpenCV2.4仍然不断发展的今天,我们在进行实际使用过程中,遇到OpenCV相关的问题,需要明确我们的版本是什么,网上解决方案对应的版本是什么。

  1. (convert the numpy.ndarray to a cv::Mat using Python/C API)[https://stackoverflow.com/questions/22667093/how-to-convert-the-numpy-ndarray-to-a-cvmat-using-python-c-api]
  2. (create Python/Cython wrapper for C++ library that uses cv::Mat class from OpenCV. )[https://stackoverflow.com/questions/22736593/what-is-the-easies
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值