为什么我在处理jpeg图像时无法链接opencv和qt?

时间:2012-08-27 22:43:15

标签: qt opencv libjpeg

当应用程序与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,但是他们的注册项目是borked或其他东西,因为它接受了注册信息,但随后拒绝尝试登录......

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。

1 个答案:

答案 0 :(得分:4)

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

我假设您使用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)并使用系统共享库。