アプリケーションが 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 の両方がインストールされています。