首先,.pro文件中引入路径
INCLUDEPATH += C:/Users/ThinkPad/AppData/Local/Programs/Python/Python36/libs
DEPENDPATH += C:/Users/ThinkPad/AppData/Local/Programs/Python/Python36/libs
INCLUDEPATH += C:/Users/ThinkPad/AppData/Local/Programs/Python/Python36/Lib/site-packages/numpy/core/include
.cpp文件
Py_Initialize();
import_array();
if ( !Py_IsInitialized() )
{
qDebug() << "not found";
}
PyObject* pModule = PyImport_ImportModule("test0623"); // 这里的test_py就是创建的python文件
if (!pModule) {
qDebug() << "cannot open";
}
PyObject* pFunRGB2GRAY= PyObject_GetAttrString(pModule,"RGB2GRAY"); // 这里的hellow就是python文件定义的函数
PyObject *ArgList = PyTuple_New(1);
cv::Mat mat;
mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
auto sz = mat.size();
int x = sz.width;
int y = sz.height;
int z = mat.channels();
uchar *CArrays = new uchar[x*y*z];//这一行申请的内存需要释放指针,否则存在内存泄漏的问题
int iChannels = mat.channels();
int iRows = mat.rows;
int iCols = mat.cols * iChannels;
if (mat.isContinuous())
{
iCols *= iRows;
iRows = 1;
}
uchar* p;
int id = -1;
for (int i = 0; i < iRows; i++)
{ // get the pointer to the ith row
p = mat.ptr<uchar>(i); // operates on each pixel
for (int j = 0; j < iCols; j++)
{
CArrays[++id] = p[j];//连续空间
}
}
npy_intp Dims[3] = { y, x, z};
PyObject *PyArray = PyArray_SimpleNewFromData(3, Dims, NPY_UBYTE, CArrays);
PyTuple_SetItem(ArgList, 0, PyArray);
PyObject *pReturn = PyObject_CallObject(pFunRGB2GRAY, ArgList);
if (pReturn) // 验证是否调用成功
{
long result = PyLong_AsLong(pReturn);
qDebug << "result:" << result;
}
Py_Finalize();
这里简单实现了一下QImage格式的图片转opencv mat再转,后传入python的功能。
在 import_array()出现报错,有返回值,返回值类型与函数类型不匹配(这段代码在的函数无返回值)。
解决办法:
找到\Path\to\Pythonfile\Python36\Lib\site-packages\numpy\core\include\numpy__multiarray_api.h,1548行左右,删去return NUMPY_IMPORT_ARRAY_RETVAL
https://blog.csdn.net/ganwenbo2011/article/details/89790762
编译,再出错
无法解析的外部符号 __imp___Py_RefTotal
无法解析的外部符号 __imp___Py_NegativeRefcount,该符号在函数 __import_array 中被引用
解决方法
修改两个头文件
1 注释掉object.h第56行
//#define Py_TRACE_REFS
2 pyconfig.h 337行
//# define Py_DEBUG