【问题标题】:importing opencv in python script called from Qt crashes在从 Qt 调用的 python 脚本中导入 opencv 崩溃
【发布时间】:2019-03-15 16:00:57
【问题描述】:

我将 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();
    
}

.pro 文件:

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

有人知道这个问题吗?

【问题讨论】:

  • .py文件的路径是什么?
  • 当你指向“.”时您表示 .py 在可执行文件旁边,对于 Qt Creator,可执行文件位于 build 文件夹中,因此我建议使用完整路径或将 .py 文件复制到 build 文件夹中。
  • 它在构建文件夹中。请注意,在所有情况下,python 脚本都会运行。但是当使用 Qt 时,它会打印“Importing cv2”并在 Import cv2 行上崩溃。
  • 好吧,如果是这样,那看起来很奇怪,我试过了,它可以正常工作
  • 使用调试器知道程序在哪一行坏了

标签: python c++ qt opencv


【解决方案1】:

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

pip install opencv-contrib-python-headless

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 2014-10-29
    • 2014-07-21
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多