写在前面
因为数字图像处理课程大作业选择了人脸识别,要求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";
结尾
给大家展示一下人脸识别成果。