C++調用Python中的函數


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)
    ...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM