将OpenCV::Mat作为.pgm加载

将OpenCV::Mat作为.pgm加载,opencv,mat,pgm,Opencv,Mat,Pgm,我有一个程序将.PGM图像文件加载到std::vector m_数据中: void LoadPgm( std::string const& filename ){ std::ifstream in( filename.c_str(), std::ios::binary ); if ( !in ){ std::cerr << "Error in Image::LoadPgm: Could not open file " << filename &l

我有一个程序将.PGM图像文件加载到std::vector m_数据中:

void LoadPgm( std::string const& filename ){
  std::ifstream in( filename.c_str(), std::ios::binary );
  if ( !in ){
     std::cerr << "Error in Image::LoadPgm: Could not open file " << filename << std::endl;
     std::exit(1);
  }

  std::string data = std::string( std::istreambuf_iterator< char >( in ),
                                  std::istreambuf_iterator< char >() );

  if ( ( data[0] != 'p' && data[0] != 'P' ) || data[1] != '5' ){
     std::cerr << "Error in Image::LoadPgm: Unsupported image format " << filename << std::endl;
     std::exit(1);
  }

  unsigned char const* p = reinterpret_cast< unsigned char* >(&data[2]);

  m_width  = ReadNumber( p );
  m_height = ReadNumber( p );

  if ( ReadNumber( p ) > 255 )
  {
     std::cerr << "Error in Image::LoadPgm: Unsupported image deep " 
               << filename << std::endl;
     std::exit(1);
  }

  p++;

  m_data.assign( p, p + m_width * m_height );
}
void LoadPgm(标准::字符串常量和文件名){
std::ifstream-in(filename.c_str(),std::ios::binary);
如果(!in){

std::cerr如果要将1通道无符号字符矩阵的所有像素可靠地复制到数组中,请执行以下操作:

cv::Mat1u source = …
std::vector<unsigned char> dest(source.rows*source.cols);

std::copy(source.begin(), source.end(), dest.begin());
cv::Mat1u源=…
std::vector dest(source.rows*source.cols);
std::copy(source.begin()、source.end()、dest.begin());

根据矩阵的来源,由于步幅的原因,您需要逐行复制。直接访问mat.data几乎不是一个好主意。
void LoadPgm(cv::Mat1b &cvimg ){
    Mat1b matimage;
    cvtColor(cvimg, matimage, CV_RGB2GRAY);

    // Create a pgm object
    std::vector<unsigned char> dest(matimage.rows*matimage.cols);
    std::copy(matimage.begin(), matimage.end(), dest.begin());
    std::stringstream in;
    in << "P5"     << std::endl;
    in << matimage.cols  << std::endl;
    in << matimage.rows << std::endl;
    in << "255"    << std::endl;
    in.write( reinterpret_cast<char*>( &dest[0] ), matimage.cols * matimage.rows );

    std::string data = std::string( std::istreambuf_iterator< char >( in ), std::istreambuf_iterator< char >() );

    if ( ( data[0] != 'p' && data[0] != 'P' ) || data[1] != '5' ){
        std::cerr << "Error in Image::LoadPgm: Unsupported image format " << std::endl;
        std::exit(1);
    }

    unsigned char const* p = reinterpret_cast< unsigned char* >(&data[2]);

    m_width  = ReadNumber( p );
    m_height = ReadNumber( p );

    if ( ReadNumber( p ) > 255 ){
        std::cerr << "Error in Image::LoadPgm: Unsupported image deep" << std::endl;
        std::exit(1);
    }

    p++;

    m_data.assign( p, p + m_width * m_height );
}
cv::Mat1u source = …
std::vector<unsigned char> dest(source.rows*source.cols);

std::copy(source.begin(), source.end(), dest.begin());