1

当应用程序链接到 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

主文件

#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。

4

1 回答 1

4

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

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

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

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

于 2012-10-26T08:43:30.370 回答