Я пытаюсь преобразовать файл dicom .dcm
в .jpeg
, используя Imebra в приложении C++, используя Qt Creator в качестве среды разработки.
Я скачал Imebra и смог успешно запустить пример проекта Qt для преобразования Dicom2Jpeg. Но когда я попытался скопировать тот же код в свое приложение на C++, оно не запустилось со следующим сообщением об ошибке:
malloc: *** error for object xxxxxx: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Я выполнил шаги по добавлению файлов Imebra в свой проект, как это было показано на сайте Imebra. Также использовал их проект qt в качестве примера. Мой main.cpp
открывает файл dicom, затем загружает его в набор данных, затем вызывает мое диалоговое окно. Вылетает при загрузке набора данных.
#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();
}
Более глубокая отладка показала, что источник ошибки находится в функции JpegCodec.cpp
файла readStream()
при проверке JpegSignature, чтобы увидеть, находится ли он в неправильном формате, что приводит к внутренней ошибке PUNTOEXE «обнаружен неправильный формат».
Интересно, что при запуске того же тестового файла dcm с использованием данного примера dicom2jpeg (который имеет точно такой же код открытия файла и его загрузки) не выдает ошибок и успешно конвертирует в jpeg. Поэтому я знаю, что проблема не в файле, а в том, как код imebra интегрирован в мое приложение на C++.
Моя среда разработки: macbook pro с ОС Lion, Qt Creator, проект Qt, код C++, добавлена библиотека ITK, файлы Imebra полностью интегрированы как часть проекта Qt.
Итак, мой вопрос: как мне работать/связывать/ссылаться/вызывать функции Imebra в проекте Qt? Я забыл что-то связать, или какой-то объект не был создан/удален вовремя?
Любые идеи высоко ценятся,
Евушка
Решение: как было предложено, я изменил фабрику кодеков на фабрику 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;
ptr<>
:imebra::dataSet* dSet = ...
. Конечно, вы получите утечку памяти за то время, пока пытаетесь. - person Joop Eggen   schedule 03.11.2012