当应用程序与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。
答案 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)并使用系统共享库。