首页 > 解决方案 > 在从 Qt 调用的 python 脚本中导入 opencv 崩溃

问题描述

我将 Python 嵌入到 Qt C++ 中。当我在 Python 脚本中导入 cv2 时,它会因分段错误而崩溃。在 Python 中运行脚本有效。在没有 Qt 的情况下从 C++ 运行。

Python 脚本:有效

print("Importing cv2")
import cv2
print("cv2 imported")

C++:工作

#include <Python.h>
#include <string>

int main(int argc, char *argv[])
{
    std::string module_name("PythonModule");

    Py_Initialize();

    PyObject* sysPath = PySys_GetObject((char*)"path");
    PyObject* pModuleDirPath = PyUnicode_FromString(".");
    PyList_Append(sysPath, pModuleDirPath);
    Py_DECREF(pModuleDirPath);

    PyObject* pModuleName = PyUnicode_FromString(module_name.c_str());
    PyObject* pModule = PyImport_Import(pModuleName);

    Py_DECREF(pModuleName);
    Py_DECREF(pModule);

    Py_Finalize();

    return 0;
}

Qt:打印“导入 cv2”后出现分段错误

MainWindow::MainWindow(QWidget *parent) :
        
    QMainWindow(parent),
    
    ui(new Ui::MainWindow)
    
{
        
    ui->setupUi(this);   
    
     

    std::string module_name("PythonModule");
    
        
    Py_Initialize();
    
        

    PyObject* sysPath = PySys_GetObject((char*)"path");
        
    PyObject* pModuleDirPath = PyUnicode_FromString(".");
    

    PyList_Append(sysPath, pModuleDirPath);
        
    Py_DECREF(pModuleDirPath);
    
        

    PyObject* pModuleName = PyUnicode_FromString(module_name.c_str());
       
    PyObject* pModule = PyImport_Import(pModuleName);
    
     

    Py_DECREF(pModuleName);
        
    Py_DECREF(pModule);
    
        

    Py_Finalize();
    
}

。轮廓:

LIBS += -L /usr/local/lib/python3.5m -lpython3.5m
    
    
INCLUDEPATH += /usr/include/python3.5m

版本:
Ubuntu 16.04
Python 3.5
opencv-python 3.4.2.17
Qt Creator 4.7.0 基于 Qt 5.11.1

有人认识到这个问题吗?

标签: pythonc++qtopencv

解决方案


问题是opencv也使用Qt,所以发生了冲突。解决方案是在没有 Qt 支持的情况下安装 opencv:

pip install opencv-contrib-python-headless

https://pypi.org/project/opencv-contrib-python-headless/


推荐阅读