如何使用C ++绑定使用NITRO NITF库访问像素值

时间:2017-01-11 17:17:23

标签: c++ image image-processing gis image-formats

我有一个任务是编写一个模块来解压缩National Imagery Transmission Format (NITF)图像,并将内存中的数据传递给各种处理模块。我选择使用NITRO库。我试图找出如何读取图像和访问像素值,但我遇到了麻烦。我正在使用C ++绑定。

我成功编译了这个库。现在,我正在尝试使用单元测试来了解如何使用库,即读取图像并访问像素值。还有一些例子here。但是,单元测试和代码片段不能直接执行此任务。

我的玩具示例如下。我尝试过以下代码的变体,但我几乎总是在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;
}

0 个答案:

没有答案