问题来源
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相关的问题,需要明确我们的版本是什么,网上解决方案对应的版本是什么。
- (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]
- (create Python/Cython wrapper for C++ library that uses cv::Mat class from OpenCV. )[https://stackoverflow.com/questions/22736593/what-is-the-easies