Qt中使用opencv库imread函数读出的图片是空

笔者在基于opencv库的qt开发中,使用cv::imread读取图片时总是读到空图片,但是用QImage读同样的图片就没问题,说明图片并未损坏,路径是对的。那问题在哪里呢?

首先,在程序运行目录下放一张简单的jpg格式图片,如果jpg格式都不能读,说明本身库的调用就有问题。

测试代码如下:

cpp 复制代码
// 测试读取一个简单的 JPG 文件
cv::Mat testImg = cv::imread("test.jpg"); // 放在构建目录下,用相对路径
if (testImg.empty()) {
    std::cout << "连普通的 JPG 都读不了!说明 imread 功能彻底坏了。" << std::endl;
} else {
    std::cout << "JPG 读取成功!说明 imread 功能正常,只是那个 BMP 文件有问题。" << std::endl;
}

结果,确实是连jpg都读不了。

我们临时生成一个图片,看看能不能读

cpp 复制代码
#include <QCoreApplication>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    
    // 测试1: 检查OpenCV是否能读取任何图片
    std::cout << "=== 测试1: OpenCV文件读取能力 ===" << std::endl;
    
    // 创建并保存一个测试图片
    cv::Mat test_img = cv::Mat::ones(100, 100, CV_8UC3) * cv::Scalar(100, 150, 200);
    cv::imwrite("test_saved.png", test_img);
    std::cout << "1. 已创建 test_saved.png" << std::endl;
    
    // 立即读取刚才保存的文件
    cv::Mat loaded = cv::imread("test_saved.png");
    if (loaded.empty()) {
        std::cout << "❌ OpenCV无法读取自己刚保存的文件!" << std::endl;
        std::cout << "   这表明OpenCV的imgcodecs模块有问题" << std::endl;
    } else {
        std::cout << "✅ OpenCV能读取自己保存的文件" << std::endl;
        std::cout << "   尺寸: " << loaded.size() << std::endl;
    }
    
    return a.exec();
}

结果连测试图片都没有创建,只打印了程序开头第一句 程序就崩溃了,崩溃提示如下:

这是典型的DLL依赖问题OpenCV库冲突。经过排查pro文件,发现我导入opencv库的语句如下:

cpp 复制代码
unix|win32: LIBS += -L$$PWD/../../../../../opencv/build/x64/vc14/lib/ -lopencv_world440

INCLUDEPATH += $$PWD/../../../../../opencv/build/x64/vc14
DEPENDPATH += $$PWD/../../../../../opencv/build/x64/vc14

unix|win32: LIBS += -L$$PWD/../../../../../opencv/build/x64/vc14/lib/ -lopencv_world440d

INCLUDEPATH += $$PWD/../../../../../opencv/build/x64/vc14
DEPENDPATH += $$PWD/../../../../../opencv/build/x64/vc14

AI问题分析:

  1. VC14 vs VC15冲突

    • 你的错误信息显示OpenCV是 vc15 编译的

    • 但你的.pro文件链接的是 vc14

    • 这是ABI不兼容,必然崩溃

  2. Release/Debug库同时链接

    • 你同时链接了 opencv_world440 (Release) 和 opencv_world440d (Debug)

    • 这会导致符号冲突

总结:Release/Debug库混用版本不匹配问题。

修复方案:区分debug和release配置:

cpp 复制代码
# 删除原来的配置,改为:

# OpenCV包含路径
INCLUDEPATH += $$PWD/../../../../../opencv/build/include

# Debug配置 - 链接Debug库
CONFIG(debug, debug|release) {
    message("Debug配置:使用Debug版OpenCV")
    LIBS += -L$$PWD/../../../../../opencv/build/x64/vc15/lib/
    LIBS += -lopencv_world440d  # 注意最后的d表示Debug
}

# Release配置 - 链接Release库
CONFIG(release, debug|release) {
    message("Release配置:使用Release版OpenCV")
    LIBS += -L$$PWD/../../../../../opencv/build/x64/vc15/lib/
    LIBS += -lopencv_world440   # 没有d,表示Release
}

现在再读取最开始的jpg文件,就没报错了。

相关推荐
2501_9307077819 小时前
使用C#代码在 PowerPoint 中组合或取消组合形状
开发语言·c#
晚烛19 小时前
CANN 调试工具与性能剖析:从日志分析到 NPU 行为追踪的完整调试体系
开发语言·windows·python·深度学习·缓存
惊鸿一博19 小时前
图标加载方式_zeroIcon_是否加前缀mdi
开发语言·前端·javascript
森G20 小时前
TypeScript 基础类型
开发语言·typescript
小poop20 小时前
string 类从入门到深入
c++
huipeng92620 小时前
企业级微服务开发实战(一):项目启动与工程化设计
java·开发语言·spring boot·spring cloud·微服务·云原生·架构
人月神话-Lee20 小时前
【图像处理】Sobel 边缘检测——让机器“看见“轮廓
图像处理·人工智能·计算机视觉·ios·ai编程·swift
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ20 小时前
java实现excel导入、下载模板方法
java·开发语言·excel
眠りたいです21 小时前
现代C++:C++14中的新语言特性和库特性
c语言·开发语言·c++
叶小鸡1 天前
Java 篇-项目实战-AI 天机学堂(从 0 到 1)-day1
java·开发语言