2

Qt Creatorを開発環境として使用して、C++アプリでImebraを使用するようにdicom.dcmファイルを変換しようとしています。.jpeg

I've downloaded Imebra and was able to run Qt project example for Dicom2Jpeg conversion successfully. But when I tried to copy same code to my C++ app it failed to run with following error msg:

malloc: *** error for object xxxxxx: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

I have followed steps on adding Imebra files to my project as it was shown on Imebra site. Also used their qt project as example. My main.cpp open dicom file, then loads it to dataset, then calls my dialog window. It crashes on loading dataset.

#include "QApplication.h"
#include "QHBoxLayout.h"
#include "mydialog.h"
#include "iostream.h"

include "library/imebra/include/imebra.h"
int main( int argc, char ** argv ){

    using namespace puntoexe;
    ptr<stream> readStream(new stream);
    readStream->openFile("/pathToDcmFile/test.dcm",std::ios_base::in);

    ptr<streamReader> reader(new streamReader(readStream));

    ptr<imebra::codecs::codecFactory> 
    cFactory(imebra::codecs::codecFactory::getCodecFactory());
    ptr<imebra::dataSet> tdataSet;
    tdataSet=cFactory->load(reader,2048);

    Q_INIT_RESOURCE(images);

    QApplication a( argc, argv );

    MyDialog md;
    md.show();

    return a.exec();

}

Deeper debugging showed that source of error is in JpegCodec.cpp file readStream() function when checking JpegSignature to see if it's in wrong format with resulting internal PUNTOEXE error "detected a wrong format".

興味深いことに、指定された dicom2jpeg の例 (ファイルを開いてロードするコードがまったく同じ) を使用して同じテスト dcm ファイルを実行すると、エラーが発生せず、jpeg に正常に変換されます。ファイルの問題ではなく、imebra コードを C++ アプリに統合する方法に問題があることはわかっています。

私の開発環境: Lion OS を搭載した macbook pro、Qt Creator、Qt プロジェクト、C++ コード、追加された ITK ライブラリ、Imebra ファイルは Qt プロジェクトの一部として完全に統合されています。

それで、私の質問は、Qt プロジェクトで Imebra 機能をどのように操作/リンク/参照/呼び出しするのですか? 何かをリンクするのを忘れていますか、それともオブジェクトが時間通りにインスタンス化/削除されていませんか?

どんなアイデアでも大歓迎です。

エヴシュカ

解決策: 示唆されたように、コーデック ファクトリを dicm ファクトリに変更し、問題を修正しました。私の新しいコードを以下に示します。

imebra::codecs::dicomCodec* pTmp = new imebra::codecs::dicomCodec();

ptr<stream> readStream(new stream);
readStream->openFile(argv[0],std::ios_base::in);

ptr<streamReader> reader(new streamReader(readStream));

ptr<imebra::dataSet> tdataSet;
tdataSet=pTmp->read(reader,2048);

delete pTmp;
4

1 に答える 1

0

ライブラリがすべてのファイル形式に対してファイルをチェックし、Dicom ファイルを読み取っているため、Jpeg コードが例外をスローするため、「間違った形式が検出されました」というエラーがスローされますが、これはコーデック ファクトリによって回復される必要があります。このバグの被害者になる可能性があります: https://bitbucket.org/puntoexe/imebra/issue/89/これにより、起動時に Dicom コーデックが静的に登録されず、ファクトリ コーデックが Dicom コーデックを完全にスキップします。バグ レポートには、回避策も含まれています。

于 2012-11-03T16:46:08.537 に答える