Как преобразовать из dlib array2d <rgb_pixel> в беззнаковый указатель на символ? - PullRequest
0 голосов
/ 10 января 2019

РЕДАКТИРОВАТЬ: Решение найдено

Мне нужно сохранить файл PPM с полученным изображением преобразования, используя dlib.

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

Я думаю, что проблема в том, когда я пытаюсь преобразовать его в беззнаковый указатель на символ, чтобы использовать его в письменном процессе файла ppm. Полученное изображение не соответствует ожидаемому. Что я делаю не так?

Я уже пробовал разные типы приведения, например, static_cast, reinterpret_cast. Я пробовал разные функции, такие как ofstream :: write, а также напрямую обращаться к памяти.

dlib::array2d<dlib::rgb_pixel> warped_image;
warped_image.set_size(h,w);
dlib::assign_all_pixels(warped_image, 0);
dlib::transform_image(
    original_image, 
    warped_image,
    dlib::interpolate_bilinear(),
    transformation_matrix);

// get warp image after transformation
unsigned char *warped = new unsigned char[h * w * chs];
unsigned char *pt = warped;

// iterate over rows
for (int row=0; row<h; row++) {
    // iterate over cols
    for (int col=0; col<w; col++) { 
        *(pt++) = warped_image[row][col].red;
        *(pt++) = warped_image[row][col].green;
        *(pt++) = warped_image[row][col].blue;
    }
}

// This function writes the resulting image perfectly
dlib::save_png(warped_image, "warped_image.png");

// This does not :-(
std::ofstream ppm("warped_image.ppm");
ppm << "P6" << std::endl;
ppm << "112 112" << std::endl;
ppm << "255" << std::endl;

/* Old code to write the PPM file
pt = warped;
for (int row=0; row<h; row++) {
    for (int col=0; col<w; col++) {
        ppm << *(pt++) << " ";
        ppm << *(pt++) << " ";
        ppm << *(pt++) << " ";
    }
}*/

// New code to write the PPM file.
ppm.write( reinterpret_cast<char*>(warped), w * h * chs);
ppm.close();

Ожидаемый результат - файл ppm, похожий на файл png, написанный с использованием dlib.

...