OpenCV + Qt 图像加载失败?警惕工作目录的陷阱!
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);

我去!破防了。
也许我们遇到问题应该多休息,这样问题就会自己解决。
然后是文件路径字符问题?
服了,同样的代码隔了一天就能正常使用了
哪就这个,现在想来可能的原因是设置环境变量后,没有重启。

更多推荐

所有评论(0)