Cython使用,python提供c++接口

一般大家用c++为python提供接口的比较多,python为c++提供接口的方法介绍不多,感觉用起来也蛮方便。有些方法在python下有很好的封装,可以调用也是不错的。
看了http://docs.cython.org/src/tutorial/cython_tutorial.html ,发现按照教程可以生成.so 文件。然后就试了一下,果然c++可以调用。
不是太会写教程,就记录一下操作的流程吧,希望对大家有帮助。

首先写一个python文件,命名为libtest_cython.pyx

#!/usr/bin/env python2
#coding:utf-8
import numpy as np
import cv2
cdef public char* test(unsigned char* in_img,int rows,int cols):    
    img = np.empty([rows,cols,3],dtype=np.uint8)
    for i in range(rows):
        for j in range(cols):
            for m in range(3):
                img[i][j][m] = int(in_img[i*cols*3+j*3+m])
    cv2.imwrite('../tmp.jpg',img)
    return "Hello World!"

然后按照官方教程编写setup.py文件

from distutils.core import setup
from Cython.Build import cythonize
setup(
    ext_modules = cythonize("libtest_cython.pyx")
)

接着写一个sh脚本,cython.sh

#!/usr/bin/env bash
python setup.py build_ext --inplace

下面是c++文件test.cpp,用来调用python生成的动态库
基本的功能是通过指针将图片传入到python生成的.so中,保存图片,然后传回Hello World! 的字符串并打印。

#include <iostream>
#include <Python.h>
#include "libtest_cython.h"
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main(){  
    Py_Initialize();   //初始化python
    initlibtest_cython();  //初始化.so
    Mat src;
    src = imread("../1.jpg");
    unsigned char* f = src.data;
    cout<<test(f,src.rows,src.cols)<<endl;
    Py_Finalize();   //结束python使用
    return 0;  
}  

然后编写CMakeLists.txt,这里可能需要根据自己的python 安装位置对cmake进行修改

project(test_cython)                           
cmake_minimum_required(VERSION 2.8)    
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")    
set(source test.cpp)   
include_directories(/usr/include/python2.7/)    #Python.h     
link_directories(/usr/lib/x86_64-linux-gnu/)    #python2.7.so
link_directories(${CMAKE_SOURCE_DIR})      #test_cython.so
find_package(OpenCV REQUIRED)   
add_executable(test_cython ${source})
target_link_libraries(test_cython python2.7.so test_cython.so ${OpenCV_LIBS})

最后是run.sh 脚本

#! /usr/bin/env bash
cd ./build
cmake .. 
make -j8
./test_cython

接着只要运行下面脚本就可以看到效果。

sh cython.sh
sh run.sh 

第一步是通过shell脚本运行了setup.py 生成了.so 文件以及.h 文件
第二步先是通过Cmake生成了Makefile,然后编译可执行文件,再运行。
运行的结果为,将文件夹下的1.jpg文件复制到tmp.jpg ,以及打印Hello World!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值