VS2010的配置(設置編譯環境)
1. 在python安裝目錄(如F:\Program Files\Python_3.5.3)下找到include和libs文件夾,將它們拷貝到sln同級目錄下。
進入項目 > 屬性 > 配置屬性 > VC++目錄 > 庫目錄,添加..\libs
進入項目 > 屬性 > C/C++ > 常規 > 附加包含目錄,添加..\include
C++代碼
void DetactImage(CString image_name, CString model_path) { try{ Py_Initialize(); if (!Py_IsInitialized()) printf("Initialize Error!\n"); PyEval_InitThreads(); // 載入module PyObject * pModule = NULL; pModule = PyImport_ImportModule("demo");//調用的Python文件名 if (!pModule) { cout<<"cannot open module!"<<endl; Py_Finalize(); return; } // 將module中的方法以字典形式讀入 PyObject *pDict = NULL; pDict = PyModule_GetDict(pModule); if (!pDict) { printf("PyModule_GetDict Error!\n"); return; } // 在方法字典中通過名字獲取對應的方法 PyObject *pFunc = NULL; pFunc = PyDict_GetItemString(pDict, "image_detact"); if (!pFunc || !PyCallable_Check(pFunc)) { printf("Can't find function[image_detact]\n"); getchar(); return; } // 設置方法的參數 PyObject *pArgs = NULL; pArgs = PyTuple_New(2); PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", image_name)); PyTuple_SetItem(pArgs, 1, Py_BuildValue("s", model_path)); //調用方法add,傳入參數 float PyObject_CallObject(pFunc, pArgs); } catch(exception& e) { cout << "Standard exception: " << e.what() << endl; } }
如果Python返回的是數組,可以使用以下方式獲取數據
PyObject *pResult = PyObject_CallObject(pFunc, pArgs); if (PyList_Check(pResult)) { //檢查是否為List對象 int SizeOfList = PyList_Size(pResult);//List對象的大小,這里SizeOfList = 3 for (int Index_i = 0; Index_i < SizeOfList; Index_i++) { PyObject *ListItem = PyList_GetItem(pResult, Index_i);//獲取List對象中的每一個元素 int NumOfItems = PyList_Size(ListItem);//List對象子元素的大小,這里NumOfItems = 3 for (int Index_k = 0; Index_k < NumOfItems; Index_k++) { PyObject *Item = PyList_GetItem(ListItem, Index_k);//遍歷List對象中子元素中的每個元素 char *cRst; PyArg_Parse(Item, "s", &cRst); cout << cRst << " "; //輸出元素 //Py_DECREF(Item); //釋放空間 } //Py_DECREF(ListItem); //釋放空間 } cout << endl; } else { cout << "Not a List" << endl; }
更多返回方式可參考以下鏈接
https://blog.csdn.net/stu_csdn/article/details/69488385
說明:
引入#include <numpy/arrayobject.h>時,如果出現“無法解析的外部符號 __imp__Py_NegativeRefcount”和“無法解析的外部符號__imp__Py_RefTotal”的錯誤,可以嘗試修改兩個頭文件
1、注釋掉object.h第56行
//#define Py_TRACE_REFS
2、pyconfig.h 375行
//# define Py_DEBUG
以上兩個宏定義注釋掉以后重新編譯 問題解決
Python代碼
import cv2 import matplotlib.pyplot as plt import tensorflow as tf def image_detact(image_name, model_path): print (image_name) print (model_path) im = cv2.imread(image_name) cv2.imshow('image', im) cv2.waitKey(0) ...
