c++调用复杂的python3脚本

写在前面

因为数字图像处理课程大作业选择了人脸识别,要求mfc实现,但感觉单纯的人脸识别有些简单,所以加上了人脸比对。在这期间尝试了各种方法,准确度都不高,最终决定使用百度API。而c++实现url访问运营商一向较为麻烦,所以想c++调取python脚本实现。

正文

平台:

vs2017 + python3.7.6

配置:

python3.7.0配置
python下载就不多说,网上教程很多。这里强调一下在安装时,要注意勾选debug选项。
若已经安装好python,可以打开修改程序:在这里插入图片描述
选择Modify
在这里插入图片描述
勾选下选项:
在这里插入图片描述
查看自己python安装路径下的libs文件夹,若有pythonxx.lib与pythonxx_d.lib
在这里插入图片描述
即可。
至此,python配置完成。
vs配置
配置vc++目录:
包含目录为自己python安装路径下的include,库目录为/libs
在这里插入图片描述
配置连接器——输入:
加入刚刚pythonxx_d.lib的文件路径
在这里插入图片描述
注意以上配置为Debug模式,x64版本,Relese下将pythonxx_.lib改为pythonxx.lib,x86要下载32位的python!

在这里插入图片描述
代码部分:
头文件:

#include <Python.h>

main:

Py_Initialize();//创造python虚拟环境初始化
if(!Py_IsInitialized())
	{
		cout<<"initial filed!";
		exit(0);
	}
PyRun_SimpleString("import sys");//必要步骤
PyRun_SimpleString("sys.path.append('./')");//''里是你的python脚本的路径,注意不用加python脚本名
//创建python对象,在C++中,python对象均为PyObject
PyObject *pModule = NULL;
PyObject *pFunc = NULL;
pModule = PyImport_ImportModule("python_name");//""中为你的脚本名,注意不加后缀.py
if(pModule)
{
	pFunc = PyObject_GetAttrString(pModule, "function_name");//""中为你想要调用的函数名
	if(pFunc)
	{
	//若C++给python传参为字符串,不可以直接传string,需要转为const char*
	//pic_path与pic_path2均为string
		const char *p1 = pic_path.c_str(); 
		const char *p2 = pic_path2.c_str();
	//C++给python传参的方式为元组,这里新建大小为2个python对象的元组
		PyObject *args = PyTuple_New(2);
	//"s"代表传递的参数类型为字符串
	//"i"代表传递的参数类型为整数
		PyTuple_SetItem(args, 0, Py_BuildValue("s", p1));
		PyTuple_SetItem(args, 1, Py_BuildValue("s", p2));
	//接受python返回的参数
		PyObject *pReturn = NULL;
		pReturn = PyEval_CallObject(pFunc, args);//执行python脚本
	//将python返回对象转为int类型
	//若想转为字符型
	//char s[256];
	//PyArg_Parse(pReturn, "s", &s);
		int nResult;
		PyArg_Parse(pReturn, "i", &nResult);
		cout<<nResult;
	}
	else
		cout<<"function error";
}
else
	cout<<"Module error";

结尾

给大家展示一下人脸识别成果。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/NiZjiTouA/article/details/105848526