C++调用Python程序以及参数的相互传递(附完整代码) 您所在的位置:网站首页 c调用python程序 C++调用Python程序以及参数的相互传递(附完整代码)

C++调用Python程序以及参数的相互传递(附完整代码)

2023-09-08 18:42| 来源: 网络整理| 查看: 265

以为c++为主程序,传入参数到Python环境中,进行数据处理后,获得返回值再传到主程序中。 

编译环境:VS2015,Python35, 下载的python中没有自带python35_d.lib,所以配置平台用release x64(后续如果需要会尝试补充debug版本),当然需要图像处理肯定还要用opencv的,版本3.x以上都可以

1.编写需要调用的python程序,代码如下,分别实现2个函数: Cal:实现数值计算功能,ImgProcessFromData实现从数据获得图像(函数中仅将图像显示出来,说明在Python中可以应用c++的图像数据),主要目的是实现将C++环境中获得的图像数据,传入到Python程序中进行处理,尤其在深度学习领域,Python实现更加便捷,而正常数据的采集和预处理等,C++的执行效率远高于Python,且很多实际应用中(比如一些相机的SDK)的主流还是C++。

import numpy as np import cv2 def Cal(a,b,c,d): try: return (a+b)*c/d except ZeroDivisionError: print('divesion by zero') def ImgProcessFromData(data): cv2.namedWindow('from data', cv2.WINDOW_NORMAL) cv2.imshow('from data',data) cv2.waitKey(0)

2.创建MFC对话框工程:下面也简单介绍了怎么做,懂MFC的可以直接跳过这

建立MFC应用程序

“应用程序类型”选择基于对话框,其他不用改,直接点击完成即可

添加2个按钮,分别为“数值计算”,以及“从数据获得图像”

3.配置调用环境

首先要把实现对应功能的.py文件放到C++的工程文件夹里面设置包含目录,除了要包含Python本身的目录外,为了将C++的图像数据转换成numpy类型传到Python中,还行包含nump目录设置库目录添加附加依赖项到此为止,所有准备步骤的都做好了,下面就可以开始实现我们的混合编程啦,通过高效运行的C++程序进行数据采集和预处理,再让Python对图像进行方便高效的分割,分类,目标检测等等。

4.C++调用Python程序

先贴上调用Python功能的类定义及实现,主要的地方都有注释

CallPython.h

#pragma once #include "stdafx.h" #include #include #include #include #include// #include // #include "object.h"//这3个就是包含python和numpy的头文件 #include #include #include #include using namespace std; using namespace cv; class CallPy { public: CallPy(); ~CallPy(); PyObject* pModule, *pDict, *pCal, *pImgProcessFromData; void PyInit(char filename[]);//初始化Python环境,加载模块和模块中的函数,filename是要调用的.py文件名 float CalbyPy(float a, float b, float c, float d);//调用模块中的 ‘Cal’函数 void ImgProFD(Mat img);//调用模块中的 ‘ImgProcessFromData’ private: };

CallPython.cpp

#include "stdafx.h" #include"CallPython.h" int init_numpy() { import_array(); } void CallPy::PyInit(char filename[]) { Py_Initialize();//初始化Python环境 init_numpy();//导入numpy库的c++版本 PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('./')"); if (!Py_IsInitialized()) return ; pModule = PyImport_ImportModule(filename);//加载.py文件 if (!pModule) { printf("Cant open python file!/n"); return ; } pDict = PyModule_GetDict(pModule);//加载文件中的函数名 if (!pDict) { printf("Cant find dictionary./n"); return ; } pCal = PyDict_GetItemString(pDict, "Cal");//根据函数名获得函数功能块,‘Cal‘为Python中定义的函数名 if (!pCal) { printf("Cant find Function. Cal /n"); } pImgProcessFromData = PyDict_GetItemString(pDict, "ImgProcessFromData");//同样根据函数名获得函数功能块,‘ImgProcessFromData‘为Python中定义的函数名 if (!pImgProcessFromData) { printf("Cant find Function. ImgProcessFromData /n"); } cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有