如何从dlib array2d <rgb_pixel>转换为无符号char指针?

时间:2019-01-10 18:43:43

标签: c++ casting dlib ppm

编辑:找到解决方案

我需要使用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文件。

0 个答案:

没有答案