【问题标题】:Why can't I link against opencv and qt when handling jpeg images?为什么我在处理 jpeg 图像时不能链接到 opencv 和 qt?
【发布时间】:2012-08-27 22:43:14
【问题描述】:

当应用程序链接到 OpenCV 2.3 或 2.4 时,从 jpeg 文件加载 QImage 对象失败。当我尝试从 jpeg 文件创建 QImage 时,程序出现段错误

QImage( "some-jpeg.jpg" )

仅当应用程序链接到 opencv 的 highgui 库时才适用。

我正在使用 OpenCV 2.4 和 Qt 4.8.1 在 Ubuntu 12.04 上构建

有谁知道为什么会发生这种情况以及我该如何解决这个问题?我的研究项目使用OpenCV的图像处理代码,前端依赖Qt。

我已将错误报告放入 Qt (https://bugreports.qt-project.org/browse/QTBUG-27032)。我在 OpenCV 上试过,但他们的注册项目很糟糕,因为它接受了注册信息,但随后拒绝尝试登录...

qt-cv-jpg-test.pro

QT += core gui

TARGET = qt-cv-jpg-test
TEMPLATE = app

INCLUDEPATH += /usr/local/include
LIBS += -L/usr/local/lib -lopencv_highgui -lopencv_core

SOURCES += main.cpp

main.cpp

#include <QImage>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"

int main(int argc, char *argv[])
{
    QString fileName = "some-jpeg.jpg";
    cv::Mat cvImage = cv::imread( fileName.toStdString() );
    QImage qtImage( fileName );
    return 0;
}

程序段错误,但这里是堆栈:

0   jpeg_CreateDecompress   /usr/local/lib/libopencv_highgui.so.2.4 0   0x7ffff7ae55fc  
1   ??  /usr/lib/x86_64-linux-gnu/qt4/plugins/imageformats/libqjpeg.so  0   0x7ffff0549ee7  
2   ??  /usr/lib/x86_64-linux-gnu/qt4/plugins/imageformats/libqjpeg.so  0   0x7ffff054a18f  
3   QImageReader::read(QImage*) /usr/lib/x86_64-linux-gnu/libQtGui.so.4 0   0x7ffff6c3f0c8  
4   QImageReader::read()    /usr/lib/x86_64-linux-gnu/libQtGui.so.4 0   0x7ffff6c3f6f7  
5   QImage::load(QString const&, char const*)   /usr/lib/x86_64-linux-gnu/libQtGui.so.4 0   0x7ffff6c348dc  
6   QImage::QImage(QString const&, char const*) /usr/lib/x86_64-linux-gnu/libQtGui.so.4 0   0x7ffff6c34a75  
7   main    main.cpp    9   0x400d10

我真的不知道为什么 opencv 方法会出现在堆栈的底部。我构建了opencv,告诉它在文件系统上使用libjpeg。我在系统上安装了 libjepg 6.2 和 libjpeg8。

【问题讨论】:

  • 感谢您发现我这个愚蠢的错字!
  • 如果你的前端用的是QT,那你需要highgui干什么?我以为它只提供了一个基本的 UI 来使用 opencv 而没有 QT 之类的东西?
  • 它具有从文件读取图像和写入文件的便利功能。当我从链接库中删除 highgui 并使用 QImage 专门从文件中读取然后将 QImage 转换为 cv::Mat 时,我能够链接。不过,我仍然想知道为什么会发生这种情况。

标签: qt opencv libjpeg


【解决方案1】:

我遇到了同样的错误 - 我们昨天晚上发现了问题。

我假设您已经使用 BUILD_JPEG 或 OPENCV_BUILD_3RDPARTY_LIBS 标志构建了 OpenCV。此外,OpenCV 安装在 /usr/local/lib 中。在这种情况下,OpenCV 是使用自己的 libjpeg 构建的,该 libjpeg 静态链接到 opencv_highgui 库中。

因此,当您创建 QImage 并将 opencv_highgui 链接到您的项目/应用程序时,链接器将搜索 jpeg_CreateDecompress 函数(该函数由 Qt 内部使用),它首先会在 opencv_highgui 中找到库。 Qt 所期望的版本(在 Ubuntu 12.04 中是 libjpeg8)和 OpenCV 发布的版本(libjpeg62)之间应该存在一些不兼容。

因此,存在一个简单的解决方案 ;-) - 构建 OpenCV 而不附带 libjpeg (BUILD_JPEG=OFF) 并使用系统共享库。

【讨论】:

  • 谢谢!我发现冲突与嵌入式 libjpeg 相关,但忘记发布答案。很好地抓住了 BUILD_JPEG 标志!
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多