使用 Qt 的程序,OpenCV 从 VS 启动时运行良好,但在使用 OpenCV 功能时运行可执行文件通常会崩溃

Posted

技术标签:

【中文标题】使用 Qt 的程序,OpenCV 从 VS 启动时运行良好,但在使用 OpenCV 功能时运行可执行文件通常会崩溃【英文标题】:Program using Qt, OpenCV runs fine when started from VS, but running the executable ordinarily crashes when OpenCV functionality would be used 【发布时间】:2019-01-04 02:39:53 【问题描述】:

我正在尝试部署我的 C++ 程序。如果我从 VS IDE(发布模式)运行程序,它的每个功能都可以工作。当我通常运行相同的可执行文件时,主窗口会正常运行,并且它的非 OpenCV 功能可以正常工作;但是当我尝试打开一张图片并让程序使用 OpenCV 的东西(打开它会调用图片上的几个 OpenCV 操作)时,它会崩溃。

我从 VS 2017 的开发人员命令提示符中成功运行了 windeployqt。但是,它没有将 OpenCV dll 复制到我的可执行文件旁边,因此我将 opencv_world400.dllopencv_ffmpeg400_64.dll 复制到了其他 dll 旁边。我认为这是我缺少某些东西的步骤。 该文件夹现在看起来像这样:

我正在使用带有 Qt5.10.1 和 OpenCV4.0 的 VS2017。我不认为我可以插入相关代码,因为项目很大,并且广泛使用 OpenCV 功能。

【问题讨论】:

您是否尝试过通过 Dependency Walker 运行它以查看是否缺少任何 DLL? 是的,但是一旦我在 Dependency Walker 中打开它,应用程序就没有响应。 我使用具有上述配置的 Opencv 3.4 并且遇到了类似的问题。问题是,我没有复制 opencv .exe,如 opencv_version.exe 、 opencv_createsamples.exe。简而言之,尝试复制 qt 应用程序旁边 bin 文件夹中的所有内容 谢谢,但这也没有解决问题。 【参考方案1】:

我想通了,问题与 OpenCV 无关(opencv_world400.dll 足以复制到文件夹中)。

问题是:我使用 Qt 的 applicationDirPath()(它返回可执行文件的路径)来访问我之前应该在那里创建的 Results 文件夹,但没有。该程序(如果从 VS 运行)正在访问 Debug 文件夹中现有的 Results 文件夹,即使我在发布模式下运行该程序并且 applicationDirPath() 正在返回Release 文件夹中可执行文件的路径。当我正常运行同一个可执行文件时,它找不到Results文件夹并崩溃了。

【讨论】:

以上是关于使用 Qt 的程序,OpenCV 从 VS 启动时运行良好,但在使用 OpenCV 功能时运行可执行文件通常会崩溃的主要内容,如果未能解决你的问题,请参考以下文章

vs2017+opencv+qt+cuda,使用cmake编译opencv的库

vs2015+opencv+qt打包exe的问题

OpenCV 从 VS2013 迁移到 QT 5.5

使用opencv时,VS提示“无法启动程序,系统找不到指定文件”,求解答!急!!

QT+VS+OpenCV联合开发-创建第一个QT程序以及快捷键学习

vs+qt+opencv海康摄像头实时预览