У меня есть задача написать модуль для распаковки Национальный формат передачи изображений (NITF) изображения и передавать данные в памяти для различных модулей обработки. Я решил использовать NITRO библиотека. Я пытаюсь выяснить, как прочитать изображение и получить доступ к значениям пикселей, но у меня возникли проблемы. Я использую привязки C ++.
Я успешно скомпилировал библиотеку. Теперь я пытаюсь использовать модульные тесты, чтобы понять, как использовать библиотеку, а именно прочитать изображение и получить доступ к значениям пикселей. Есть также несколько примеров Вот. Однако модульные тесты и фрагменты кода не выполняют эту задачу напрямую.
Мой игрушечный пример ниже. Я попробовал варианты кода ниже, но я почти всегда получаю некоторые ошибки в image_reader.read()
, Приведенный ниже код приводит к ошибке из-за слишком большого количества полос, но если я ограничу количество полос, я не получу ошибку, но в буфере, похоже, нет никаких значений.
Я был бы благодарен всем, кто мог бы дать мне несколько советов или советов о том, как использовать эту библиотеку для доступа к значениям пикселей.
#include "stdafx.h"
#define IMPORT_NITRO_API
#include <import/nitf.hpp>
int _tmain(int argc, _TCHAR* argv[])
{
const std::string filename = "my_image.NTF";
nitf::Reader reader;
nitf::IOHandle io(filename.c_str());
nitf::Record record = reader.read(io);
nitf::List images = record.getImages();
nitf::ListIterator iter = images.begin(); // NITF can store more than one image - just try the first
nitf::ImageSegment segment = *iter;
nitf::SubWindow window; // define a subwindow for reading - try to read the whole image although it might be slow
unsigned int numRows = segment.getSubheader().getNumRows();
unsigned int numCols = segment.getSubheader().getNumCols();
const int band_count = segment.getSubheader().getBandCount();
window.setNumRows(numRows);
window.setNumCols(numCols);
window.setNumBands(band_count);
nitf::Uint32* band_list = new nitf::Uint32[band_count];
for (nitf::Uint32 band_number = 0; band_number < band_count; band_number++)
band_list[band_number] = band_number;
window.setBandList(band_list);
auto image_reader = reader.newImageReader(1); // 1 seems to be the image number: nitro-master\c\nitf\tests\test_create_xmltre.c
std::vector< std::vector<nitf::Uint8> > buffer(band_count); // User-defined data buffers for read
for (nitf::Uint32 band_number = 0; band_number < band_count; band_number++)
buffer[band_number].resize(numRows * numCols);
int padded = 0; // Returns TRUE if pad pixels may have been read
image_reader.read(window, (nitf::Uint8**)&buffer[0], &padded);
return 0;
}
Задача ещё не решена.
Других решений пока нет …