2013-11-10 4 views
4

Я пытаюсь скопировать класс vtkImageData * в структуру cv :: Mat [моя цель - прочитать MHD-файл в OpenCV] .. Файл по существу является 3D-матрицей, поэтому я хочу чтобы получить вектор, содержащий все кусочки объема. До сих пор, я пришел с этим кодом,Скопировать vtkImageData в cv :: Mat

reader->SetFileName(INPUT_DATA_1.c_str()); 
reader->Update(); 
imageData_1 = reader->GetOutput(); 
extractVOI->SetInput(imageData_1); 

int dims[3]; 
imageData_1->GetDimensions(dims); 
extractVOI->SetVOI(0, dims[0], 0, dims[1], 75, 75); // Set it to z=75 
extractVOI->GetOutput()->SetScalarTypeToSignedChar(); 
imageExport->SetInputConnection(extractVOI->GetOutputPort()); 
imageExport->Update(); 

cv::Mat cvMat_test(dims[0], dims[1], CV_8UC1, imageExport->GetPointerToData()); 

Хотя это работает, это не дает мне ожидаемый результат (которые приводятся ниже) .. Любая помощь по этому вопросу было бы очень полезно ..

Спасибо заранее, Sarthak

Ожидаемые результаты,

expected_output

Выход я получаю сейчас,

actual_output

EDIT: Я понимаю, что изображения не совпадает с размером. Это связано с тем, что я только что опубликовал моментальный снимок данных из программы просмотра, которую я использую. В приведенном ниже примере есть ссылка HERE. Надеюсь, что это проясняет вещи немного больше ..

TAGS: ВТК OpenCV мост, vtkopencv, ВТК OpenCV интегрировать

ответ

3

Хорошо, так что GetPointerToData() функция или GetScalarPointer() функция используется непосредственно на vtkImageData класса не подходят для размещения (по крайней мере, не в как я мог понять) .. Итак, я придумал еще один способ,

reader->SetFileName(INPUT_DATA_1.c_str()); 
reader->Update(); 
imageData_1 = reader->GetOutput(); 
extractVOI->SetInput(imageData_1); 

int dims[3]; 
imageData_1->GetDimensions(dims); 
extractVOI->SetVOI(0, dims[0], 0, dims[1], 75, 75); // Set it to z=75 
extractVOI->GetOutput()->SetScalarTypeToSignedChar(); 
cv::Mat cvMat_test(dims[0], dims[1], CV_8UC1); 

for (int i=0; i<dims[0]; ++i) { 
    for (int j=0; j<dims[1]; ++j) { 
     cvMat_test.at<unsigned char>(cv::Point(j,i)) = *static_cast<unsigned char*>(extractVOI->GetOutput()->GetScalarPointer(i,j,vol_dim)); 
    } 
} 

Я предполагаю, что этот метод может быть расширена, чтобы включить весь объем довольно легко ..

EDIT:

Я продлил свой код, чтобы сделать переходы и из vtkImageData и сорта :: Мат и/или сорта :: :: Мат ГПУ .. Я загрузил в код here в vtkOpenCVBridge.

Cheers.!

0

Во-первых, изображения не одного и того же размера. Даже если данные не сохранены правильно, по крайней мере ширина и высота изображений должны быть одинаковыми. Это означает, что dims [0] и dims [1] - это не высота и ширина изображения.

Во-вторых, вы уверены, что данные в изображении vtk хранятся в виде массива unsigned char? У меня есть модели, похожие на ваши, когда я пытался хранить изображение ints в изображении неподписанных символов.

В-третьих, вы уверены, что ваше изображение vtk непрерывно в памяти (вы не предоставляете шаг между следующими строками)?

Я никогда не работал с библиотекой ВТК, так что мой ответ лишь предположение ...

+0

Привет, спасибо, что ответили. Изображение сверху - это снимок от используемого мной зрителя (это не фактический размер). Я обновил свой вопрос на примере данных, которые я использую. Я уверен, что образ * unsigned char * (это стандарт в машине для сбора данных). Я не уверен, является ли изображение непрерывным или нет; но я читаю все это в своей программе. – scap3y

0

Я столкнулся с подобной проблемой, проведя огромное время, я понял, что меняю размеры, высоту и ширину. Повторное определение размеров правильно дало мне лучший результат.Я не работал с библиотекой VTK, но думаю, что вы можете перепроверить объявления измерений.

+0

Я уже решил проблему; спасибо за ответ, хотя. – scap3y

Смежные вопросы