Qt引用python和numpy踩坑

首先,.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

https://www.jb51.net/article/108588.htm

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值