原本只想简单测试 opencv(以下简称cv2) 通过 cmake 编译然后通过 Qt 能否运行成功。成功后就想试试做一个图片查看器,于是就遇到该错误:闪退??然后底部弹出 \..\*.exe exited with code 3
。
所使用Qt版本为5.14.2,Qt Creator版本为4.11.1,opencv版本为3.4.6。
将cv2引入到Qt5
前提是cv2(bin文件夹)添加到环境变量中,这里不作赘述。
1. 添加 pro 工程文件
只需要在 pro 文件最后加上以下两行代码即可。这里需要注意不光要编译成功,一定要安装cv2到本地,找到自己电脑相对应路径,在当前路径下打开 cmd,输入mingw32-make install
后当前文件夹就会出现 install 文件夹。
## 包含路径
INCLUDEPATH += D:\codeEnvironment\visiondev\opencv_build\install\include
## 库文件
LIBS += D:\codeEnvironment\visiondev\opencv_build\lib\libopencv_*.a
2. 测试代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/core.hpp> // Mat
#include <opencv2/highgui.hpp> // namedWindow imshow waitKey
#include <opencv2/imgproc.hpp> // imread
#include <QDebug>
// 引入 cv 命名空间
using namespace cv;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 测试代码 imread 最好使用绝对路径
Mat image = imread("D:\\photo\\TS.jpg");
// 窗口名 + 自动大小
namedWindow("Image Window", WINDOW_AUTOSIZE);
imshow("Display Image", image);
waitKey();
}
MainWindow::~MainWindow()
{
delete ui;
}
测试结果如下:
闪退解决:中文路径
修改上述代码成为一个打开图片的事件:
void MainWindow::on_pushButton_clicked()
{
QString imgPath = QFileDialog::getOpenFileName(this, "打开图片", "D:/photo/", "(打开图片(*.png *.jpg *.bmp))");
// 读取:把路径转换成一个 Mat 对象
Mat image = imread(imgPath.toStdString());
// 窗口名 + 自动大小
namedWindow("Image Window", WINDOW_AUTOSIZE);
imshow("Display Image", image);
waitKey();
点击按钮运行选择图片完成后就出现闪退(有时候会无响应),并弹出以下代码:
然后通过网上资料查看,都说是路径出现了问题,于是我加上了这两行代码:
// 判断文件是否存在::Qt
QFile file(imgPath);
if (!file.exists())
{
qDebug() << "文件不存在:" << imgPath;
return;
}
// 判断文件路径是否为空::cv2
if(image.empty())
{
qDebug() << "无法加载图像:" << imgPath;
return;
}
再次运行出现的问题如下,输出反馈中路径出现了中文路径。修改掉即可解决。以上仅供参考。如若有任何问题和建议,欢迎共同探讨!
可能遇到的问题
- opencv 要安装后在再集成到 Qt 库
- 将 opencv 添加到环境变量
- 尽量使用英文路径
点赞