OpenCV + Qt 图像加载失败?警惕工作目录的陷阱!

关键词:opencv-4.11.0、Qt、文件路径、工作目录、图像加载


问题背景

在安装好opencv后,测试遇到如下情况

[ WARN:0@0.056] global loadsave.cpp:268 findDecoder imread_(‘wwudi.jpg’): can’t open/read file: check file path/integrity
OpenCV: terminate handler is called! The last OpenCV error is:
OpenCV(4.11.0) Error: Assertion failed (size.width>0 && size.height>0) in imshow, file G:\opencv\opencv\sources\modules\highgui\src\window.cpp, line 973

    Mat image=imread(“E:\Fighting.jpg”,1);
    Mat image=imread(“E:\wwudi.jpg”,1);

无论是绝对路径还是相对路径都不行。

[ WARN:0@0.060] global loadsave.cpp:268 findDecoder imread_('‪./wwudi.jpg'): can't open/read file
OpenCV Error: Assertion failed (size.width>0 && size.height>0) in imshow

后来实在不行,还是希望在相对路径下完成,尽管确认了文件存在,甚至将图片放在源码同级目录,程序仍无法加载图像,最终发现是 工作目录(Working Directory) 的认知误区所致。


错误现象

  • OpenCV 报错提示文件路径无效,但代码中使用了看似正确的相对路径 "./wwudi.jpg"
  • 手动打印验证文件存在性返回 true,但 cv::imread 始终加载失败
  • 最终发现程序运行时的工作目录与开发者预期目录不一致

核心结论

Qt 程序默认的工作目录是可执行文件(.exe)所在位置,而非源码目录!

而opencv会默认

请添加图片描述

修改代码测试过

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;


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

    // 1. 打印工作目录和文件存在性
    qDebug() << "当前工作目录:" << QDir::currentPath();
    qDebug() << "文件是否存在:" << QFile::exists("./wwudi.jpg");

    // 2. 加载图像
    cv::Mat image = cv::imread("wwudi.jpg", cv::IMREAD_COLOR);
    if (image.empty()) {
        qDebug() << "错误:OpenCV 无法加载图像!";
        return;
    }

    // 3. 显示图像(使用 Qt)
    cv::cvtColor(image, image, cv::COLOR_BGR2RGB);
    QImage qtImage(image.data, image.cols, image.rows, image.step, QImage::Format_RGB888);
    QLabel *imageLabel = new QLabel(this);
    imageLabel->setPixmap(QPixmap::fromImage(qtImage));
    setCentralWidget(imageLabel);
}

当前工作目录: “G:/GraduationProject/repaintandopen/repaintandopen/build/Desktop_Qt_6_6_3_MinGW_64_bit-Debug”
文件是否存在: false
错误:OpenCV 无法加载图像!

GraduationProject/
├─ repaintandopen/
│  ├─ build/                          # 编译生成目录
│  │  ├─ Desktop_Qt_6_6_3_MinGW_64_bit-Debug/
│  │  │  ├─ debug/                    # 实际工作目录
│  │  │  │  ├─ repaintandopen.exe     # 可执行文件位置
│  ├─ wwudi.jpg                       # 我以为的"当前目录"

程序运行时的工作目录是 debug/ 文件夹,而非源码所在的 repaintandopen/ 目录。因此必须将图片放在 debug/ 下才能被正确读取。


完整解决方案

步骤 1:定位真实工作目录

在代码中添加调试语句验证实际工作路径:

#include <QDir>
qDebug() << "当前工作目录:" << QDir::currentPath();

步骤 2:放置文件到正确位置

请添加图片描述

G:\GraduationProject\repaintandopen\repaintandopen\build\Desktop_Qt_6_6_3_MinGW_64_bit-Debug\debug

步骤 3:读

cv::Mat image = cv::imread("wwudi.jpg", cv::IMREAD_COLOR);

请添加图片描述

大捷

其他问题

1. 路径隐藏字符问题

一开始使用绝对路径打印后出现了“\u202AG:…”,因为后续解决没往那个方向靠暂时不管。

18:43:39: Starting G:\GraduationProject\repaintandopen\repaintandopen\build\Desktop_Qt_6_6_3_MinGW_64_bit-Debug\debug\repaintandopen.exe...
当前路径: "\xE2\x80\xAAG:/AaaTEST/wwudi.png"
错误:文件不存在!
18:43:44: 
QString sanitizedPath = path.remove(QRegularExpression("[^\\x20-\\x7F]"));

总结

明显这只是一个不好的解决方案,大家提供一个思路,实在不想写了,累了。

探索

很奇怪,绝对路径无论如何是不应该读不出图的。

反过来尝试,我能不能往绝对路径中写呢?

	cv::Mat image = cv::imread("wwudi.jpg", cv::IMREAD_COLOR);
    namedWindow( "Display window", WINDOW_AUTOSIZE );
    imshow( "Display window", image );

    imwrite("G:\\AaaTEST\\wwwudi.jpg",image);

请添加图片描述

可以!已经开始害怕了,要是只是前几天不行,今天又可以了的话,瓦达西。

尝试以下代码

    cv::Mat image = cv::imread("G:\\AaaTEST\\wwudi.jpg", cv::IMREAD_COLOR);
    namedWindow( "Display window", WINDOW_AUTOSIZE );
    imshow( "Display window", image );

    imwrite("G:\\AaaTEST\\wwwudi.jpg",image);

请添加图片描述

我去!破防了。

也许我们遇到问题应该多休息,这样问题就会自己解决。

然后是文件路径字符问题?

服了,同样的代码隔了一天就能正常使用了

哪就这个,现在想来可能的原因是设置环境变量后,没有重启。
请添加图片描述

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐