了解PGM数据并将PGM数据加载到向量/数组中

问题描述

首先说这是我第一次使用C ++处理pgm文件格式,所以我有很多问题。

  1. 我目前正在使用P2 pgm文件,但我读到P5使用起来要简单得多。如何将P2转换为P5?

  2. 使用P2,我试图拍摄图像并将像素值传输到2D向量或数组或可远程索引的任何内容。我使用的是非常基本的图像(白色背景,前景中有黑色矩形)。到目前为止,这是我的代码

    fstream img;
    img.open(PATH_NAME,ios::in | ios::binary | ios::out);
    
    string line;
    getline(img,line); //header part that says "P2"

    //stores column and row values
    getline(img,line);
    istringstream iss(line);
    string row_string,col_string;
    iss >> row_string;
    iss >> col_string;
    int original_rows = stoi(row_string);
    int original_cols = stoi(col_string);
    
    getline(img,line);//collects maxval

    //Now I am collecting actual image/pixel data
    getline(img,line);
    cout << line;

最后一部分的问题是当我cout << line; 时,这是输出

\377\377\377\377\377\377\377\377\377\377\377\377\

且持续运行的时间比单行要长得多(我的示例照片中有162列,此代码输出的时间远远超过162 377s)。最大值是255,所以我不确定是什么问题。

  1. 关于将这些值实际转换为可索引的内容,我该如何处理?到目前为止,我的想法是采用每条字符串行,检测'\'并以此方式收集各个值并将其存储在数组中;将每个字符串转换为int,然后将其存储在向量中。说起来容易做起来难,所以我愿意接受更有效的选择。

解决方法

问题是您将文本I / O与二进制I / O混淆了。据我了解,P5文件中的图像数据保存为二进制字节值。因此,您应该使用class Game(models.Model): gameday = models.CharField(max_length=120) hometeam1 = models.ForeignKey(Teams,on_delete=models.CASCADE,related_name="hometeam1",blank=True,null=True) class Tipp(models.Model): hometeam1 = models.ForeignKey(Game,default=Game.hometeam1) week = models.CharField(max_length=120,null=True,blank=True) 将其读取到字节向量(或类似的字节)中,而不要使用用于文本I / O的read来读取它。

getline

vector<unsigned char> raster(original_rows*original_cols); img.read(raster.data(),original_rows*original_cols); 是您可索引的内容。