РЕДАКТИРОВАТЬ: Решение найдено
Мне нужно сохранить файл 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.