c++调用Tensorflow模块

最近在搞Kinect人体骨架识别的研究,因为姿势识别要用到深度学习方面的东西,而现在比较流行的深度学习框架是tensorflow,对python支持的相当好,我的项目是用C++写的,难免这两种语言做交互,接下来我就C++如何调python做一下总结。
一,建一个win32控制台项目C++_Tensorflow
右键项目属性,VC++目录——>包含目录D:\Program Files\Python36\include
库目录D:\Program Files\Python36\libs;D:\Program Files\Python36\Lib
然后打开python的安装目录,找到libs文件夹,复制一份python36.lib,并命名为python36_d.lib(这个的原因是inlcude目录下的pyconfig.h里面的代码在debug下调用的是python36_d.lib)
二,准备工作
把python安装目录下的python36.dll、自己的python脚本TensorflowTest.py都放到Debug目录或Release目录下(里面有xx.exe文件)
三,代码实现
main.cpp

#include <iostream>
#include <Python.h>
using namespace std;
//调用输出"Hello Python"函数
void Hello()
{
    Py_Initialize();//调用Py_Initialize()进行初始化
    PyObject * pModule = NULL;
    PyObject * pFunc = NULL;
    pModule = PyImport_ImportModule("TensorflowTest");//调用的Python文件名
    if (!pModule)
    {
        cout << "打开python文件失败";
        return;
    }
    pFunc = PyObject_GetAttrString(pModule, "Hello");//调用的函数名
    if (!pFunc)
    {
        cout << "无此方法";
        return;
    }

    //返回值
    PyObject *pReturn = NULL;
    pReturn = PyEval_CallObject(pFunc, NULL);//调用函数
    //将返回值转换为int类型
    int result;
    PyArg_Parse(pReturn, "i", &result);//i表示转换成int型变量
    cout << "结果 = " << result << endl;

    //PyEval_CallObject(pFunc, NULL);//调用函数,NULL表示参数为空
    Py_Finalize();//调用Py_Finalize,和Py_Initialize相对应的.
}
//调用Add函数,传两个int型参数
void Add()
{
    Py_Initialize();
    PyObject * pModule = NULL;
    PyObject * pFunc = NULL;
    pModule = PyImport_ImportModule("TensorflowTest");//Test001:Python文件名
    pFunc = PyObject_GetAttrString(pModule, "Add");//Add:Python文件中的函数名
    //创建参数:
    PyObject *pArgs = PyTuple_New(2);//函数调用的参数传递均是以元组的形式打包的,2表示参数个数
    PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 6));//0--序号,i表示创建int型变量
    PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 8));//1--序号
    //返回值
    PyObject *pReturn = NULL;
    pReturn = PyEval_CallObject(pFunc, pArgs);//调用函数
    //将返回值转换为int类型
    int result;
    PyArg_Parse(pReturn, "i", &result);//i表示转换成int型变量
    cout << "6 + 8 = " << result << endl;
    Py_Finalize();
}
int main(int argc, char** argv)
{
    cout << "调用Test001.py中的Hello函数..." << endl;
    Hello();
    cout << "\n调用Test001.py中的Add函数..." << endl;
    Add();
    getchar();
    return 0;
}

TensorflowTest.py

import tensorflow as tf

def Hello():
    a = tf.constant(2)
    b = tf.constant(2)
    c = tf.add(a, b)
    with tf.Session() as sess:
        d=sess.run(c)
    return d
def Add(a, b):
    return a+b

注意:如果要调用的函数参数是指定的文件,需把文件放到工程目录(和Debug目录同级)下

猜你喜欢

转载自blog.csdn.net/sz793919425/article/details/79430411