c++呼叫Tensorflow模組
阿新 • • 發佈:2019-02-17
最近在搞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目錄同級)下