我的任务是编写一个模块来解压缩国家图像传输格式 (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;
}