2

我的任务是编写一个模块来解压缩国家图像传输格式 (NI​​TF)图像并将内存中的数据传递给各种处理模块。我选择使用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;
}
4

0 回答 0