1. 程式人生 > >c++呼叫Tensorflow模組

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目錄同級)下