参考网站:
-
https://blog.csdn.net/qq7835144/article/details/106073110?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-1&spm=1001.2101.3001.4242
- https://blog.csdn.net/weixin_46400740/article/details/116711323?spm=1001.2014.3001.5501
1、配置项目属性表
将Python目录下的include和libs文件夹路径配置到属性表中,如果需要用到虚拟环境,就把envs虚拟环境下的相关文件路径配置到属性表
如果 需要用到一些其他的第三方库 就要再次进行关联。例如用numpy 就需要去Lib/site-packages 下 关联需要用到的包






2、C++代码编辑
导入头文件 Python.h:#include <Python.h>
Py_SetPythonHome(L"D:\\anaconda");
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('.')");
PyObject* pModule = PyImport_ImportModule("test");
cout << "Python get module failed." << endl;
cout << "Python get module succeed." << endl;
pFunc = PyObject_GetAttrString(pModule, "func");
PyEval_CallObject(pFunc, NULL);
报错1:



3、传参类型表

1.调用无参 无返回值
PyEval_CallObject(pFunc, NULL);
2.调用无参 但有返回值
PyObject * pp = PyEval_CallObject(pFunc, NULL);
PyArg_Parse(pp, "i", &res);
cout << "res:" << res << endl;
3.调用有参 无返回值
PyObject* pArgs = PyTuple_New(2);
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 2));
PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 4));
PyEval_CallObject(pFunc, pArgs);
4.调用有参 有返回值
PyObject* pArgs = PyTuple_New(2);
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 2));
PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 4));
PyObject * pp = PyEval_CallObject(pFunc, pArgs);
PyArg_Parse(pp, "i", &res);
cout << "res:" << res << endl;
5.c++ Mat 转 python Numpy
Mat转Numpy需要配置numpy库,见上面
#include <numpy/arrayobject.h>
Mat img = imread("./frame.png");
cout << "img read wrong" << endl;
cout << img.size() << endl;
uchar *CArrays = new uchar[x*y*z];
int iChannels = img.channels();
int iCols = img.cols * iChannels;
for (int i = 0; i < iRows; i++)
for (int j = 0; j < iCols; j++)
npy_intp Dims[3] = { y, x, z };
PyObject *PyArray = PyArray_SimpleNewFromData(3, Dims, NPY_UBYTE, CArrays);
报错:

解决办法:在Py_Initialize()后加入“import_array()”语句即可。 在有返回值的函数里,括号里需要有对应类型的返回值

注意:当编译"import_array()"时,可能会出现以下错误:


解决方法:在自己安装的python目录中搜索"object.h"文件,将其56行"#define Py_REF_DEBUG"语句注释掉即可。


6、 c++ PyArrayObject 转 Mat
PyArrayObject *Py_array1;
if (PyTuple_Check(pReturn)) {
PyArg_UnpackTuple(pReturn, "ref", 2, 2, &Py_array1, &a);
npy_intp *Py_array1_shape = PyArray_DIMS(Py_array1);
npy_intp array1row = Py_array1_shape[0];
npy_intp array1col = Py_array1_shape[1];
npy_intp array1high = Py_array1_shape[2];
Mat mask(array1row, array1col, CV_8UC3, PyArray_DATA(Py_array1));
imwrite("./cut.png", mask);
VS Qt中C++调用Python 报错

问题出在python.h这个头文件中存在一个变量名叫“slots”,然而slots又是qt的关键字,所以qt的moc会把它当成宏先处理掉。
找到python/include下object.h文件 将第448行改为

c++ 调用Python接口 Mat传参与接收 完整代码
c++端代码
#include <numpy/ndarrayobject.h>
#include <opencv2/opencv.hpp>
Py_SetPythonHome(L"D:/anaconda");
cout << "Python start --------------------" << endl;
if (!Py_IsInitialized()) {
cout << "Python start defeat--------------------" << endl;
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('.')");
PyObject *moduleName = PyUnicode_FromString("demo_test");
PyObject *pModule = PyImport_Import(moduleName);
printf("can't find python file");
PyObject *pFunc = PyObject_GetAttrString(pModule, "run");
printf("can't find function [run]");
Mat img = imread("frame.png");
cout << "img read wrong" << endl;
cout << img.size() << endl;
uchar *CArrays = new uchar[x*y*z];
int iChannels = img.channels();
int iCols = img.cols * iChannels;
for (int i = 0; i < iRows; i++)
for (int j = 0; j < iCols; j++)
npy_intp Dims[3] = { y, x, z };
PyObject *PyArray = PyArray_SimpleNewFromData(3, Dims, NPY_UBYTE, CArrays);
PyObject *ArgList = PyTuple_New(1);
PyTuple_SetItem(ArgList, 0, PyArray);
PyObject *pReturn = PyObject_CallObject(pFunc, ArgList);
printf("Return value is NULL.");
PyArrayObject *Py_array1;
if (PyTuple_Check(pReturn)) {
PyArg_UnpackTuple(pReturn, "ref", 2, 2, &Py_array1, &a);
npy_intp *Py_array1_shape = PyArray_DIMS(Py_array1);
npy_intp array1row = Py_array1_shape[0];
npy_intp array1col = Py_array1_shape[1];
npy_intp array1high = Py_array1_shape[2];
Mat mask(array1row, array1col, CV_8UC3, PyArray_DATA(Py_array1));
imwrite("test.png", mask);
python端代码
注意这里的返回值是元祖形式
完结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2019-08-15 Windows下实现应用程序看门狗软件
2018-08-15 如何生成转储(dmp)文件--工具篇
2017-08-15 编译libevent源代码(Windows)
2013-08-15 一 VC2008环境中ICE的配置
2013-08-15 二 示例程序一
2013-08-15 三 ICE开发初级研究
2013-08-15 VC断点不可用的问题