编辑:找到解决方案
我需要使用dlib将PPM文件与转换的结果图像一起保存。
我知道从dlib生成的图像很好,因为我可以将其保存为png并打开以进行视觉检查。
我认为问题是当我尝试将其转换为未签名的char指针,以便在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文件,类似于使用dlib编写的png文件。