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

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 メソッドがスタックの一番下に表示される理由がよくわかりません。ファイルシステムでlibjpegを使用するように指示するopencvを構築しました。システムに 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 によって内部的に使用されます) を検索します。また、Qt が期待するバージョン (Ubuntu 12.04 では libjpeg8) と OpenCV の出荷バージョン (libjpeg62) の間には、いくつかの非互換性があるはずです。

したがって、簡単な解決策があります ;-) - 同梱の libjpeg (BUILD_JPEG=OFF) なしで OpenCV をビルドし、システム共有ライブラリを使用します。

于 2012-10-26T08:43:30.370 に答える