vs2010編譯錯誤,求指導




/* use imRef to access image data. */
#define imRef(im, x, y) (((uchar *)(im->imageData+y*im->widthStep))[x])
  
/* use imPtr to get pointer to image data. */
#define imPtr(im, x, y) &(((uchar *)(im->imageData+y*im->widthStep))[x])

static image <uchar> *loadPBM(const char *name) 
{
  char buf[BUF_SIZE];
  
  /* read header */
  std::ifstream file(name, std::ios::in | std::ios::binary);
  pnm_read(file, buf);
  if (strncmp(buf, "P4", 2))
    throw pnm_error();
    
  pnm_read(file, buf);
  int width = atoi(buf);
  pnm_read(file, buf);
  int height = atoi(buf);
  
  /* read data */
  image<uchar> *im = new image<uchar>(width, height);
  for (int i = 0; i < height; i++)
    read_packed(imPtr(im, 0, i), width, file);
  
  return im;
}

f:\課程資料\圖論\基於圖論的圖像處理\程序\graphsegment\pnmfile.h(104) : error C2039: “imageData”: 不是“image<T>”的成員
1>        with
1>        [
1>            T=uchar
1>        ]







12 个解决方案

#1


第二十五行出現的問題,求解決辦法

#2


#3


/*
Copyright (C) 2006 Pedro Felzenszwalb

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
*/

/* a simple image class */

#ifndef IMAGE_H
#define IMAGE_H

#include <cstring>

typedef unsigned char uchar;

template <class T>
class image
{
 public:
 /* create an image */
 image(const int width, const int height, const bool init = true);
 /* delete an image */
 ~image();
  /* init an image */
  void init(const T &val);
 /* copy an image */
  image<T> *copy() const;

//  /* get the width of an image. */
  int width() const { return w; }
  
//  /* get the height of an image. */
int height() const { return h; }
//  
 /* image data. */
  T *data;
//  
//  /* row pointers. */
  T **access;
//  
 private:
  int w, h;
};

/* use imRef to access image data. */
#define imRef(im, x, y) (((uchar *)(im->imageData+y*im->widthStep))[x])
  
/* use imPtr to get pointer to image data. */
#define imPtr(im, x, y) &(((uchar *)(im->imageData+y*im->widthStep))[x])

template <class T>
image<T>::image(const int width, const int height, const bool init)
{
 w = width;
 h = height;
 data = new T[w * h];  // allocate space for image data
 access = new T*[h];   // allocate space for row pointers

// initialize row pointers
 for (int i = 0; i < h; i++)
  access[i] = data + (i * w);  

  if (init)
    memset(data, 0, w * h * sizeof(T));
}


template <class T>
image<T>::~image()
{
  delete [] data; 
delete [] access;
}
template <class T>
void image<T>::init(const T &val) 
{
  T *ptr = imPtr(this, 0, 0);
  T *end = imPtr(this, w-1, h-1);
  while (ptr <= end)
    *ptr++ = val;
}
template <class T>
image<T> *image<T>::copy() const
{
  image<T> *im = new image<T>(w, h, false);
  memcpy(im->data, data, w * h * sizeof(T));
  return im;
}

#endif
  


我打錯了,是vs2008!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!vs2008vs2008vs2008vs2008vs2008vs2008vs2008vs2008vs2008

#4


編譯選項加/EP /P,重新編譯,查看宏展開后對應的.i文件。

#5


你的image模版沒有widthStep和imageData函數,你是不是copy漏了什么東西?你這個模板只能用於uchar類型當數據,應該是默認模版,應該是漏了另外一個模板。

#6


引用 5 樓 lovesmiles 的回復:
你的image模版沒有widthStep和imageData函數,你是不是copy漏了什么東西?你這個模板只能用於uchar類型當數據,應該是默認模版,應該是漏了另外一個模板。


//  /* get the width of an image. */  int width() const { return w; }   //  /* get the height of an image. */int height() const { return h; }//  


這里不是?還是,求指導啊,要自己加上的話,怎么寫

#7


錯誤提示很明顯,是你的image里沒有imageData成員,你看看你的image類

#8


引用 4 樓 zhao4zhong1 的回復:
編譯選項加/EP /P,重新編譯,查看宏展開后對應的.i文件。

code=c]/* use imPtr to get pointer to image data. */#define imPtr(im, x, y) &(((uchar *)(im->imageData+y*im->widthStep))[x])


[/code]

#9


引用 7 樓 xl890727 的回復:
錯誤提示很明顯,是你的image里沒有imageData成員,你看看你的image類


我重新改了一下,又成這樣了,求指導啊




/*
Copyright (C) 2006 Pedro Felzenszwalb

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
*/

/* image conversion */

#ifndef CONV_H
#define CONV_H

#include <climits>
#include "image.h"
#include "imutil.h"
#include "misc.h"

#define RED_WEIGHT 0.299
#define GREEN_WEIGHT 0.587
#define BLUE_WEIGHT 0.114

static image<uchar> *imageRGBtoGRAY(image<rgb> *input) 
{
  int width = input->width();
  int height = input->height();
  image<uchar> *output = new image<uchar>(width, height, false);

  for (int y = 0; y < height; y++)
  {
    for (int x = 0; x < width; x++)
{
      imRef(output, x, y) = (uchar)((imRef(input, x, y).r) * RED_WEIGHT + (imRef(input, x, y).g )* GREEN_WEIGHT +( imRef(input, x, y).b )* BLUE_WEIGHT);
    }
  }
  return output;
}

static image<rgb> *imageGRAYtoRGB(image<uchar> *input)
{
  int width = input->width();
  int height = input->height();
  image<rgb> *output = new image<rgb>(width, height, false);

  for (int y = 0; y < height; y++)
  {
    for (int x = 0; x < width; x++)
{
      imRef(output, x, y).r = imRef(input, x, y);
      imRef(output, x, y).g = imRef(input, x, y);
      imRef(output, x, y).b = imRef(input, x, y);
    }
  }
  return output;  
}

static image<float> *imageUCHARtoFLOAT(image<uchar> *input) {
  int width = input->width();
  int height = input->height();
  image<float> *output = new image<float>(width, height, false);

  for (int y = 0; y < height; y++) 
  {
    for (int x = 0; x < width; x++)
{
      imRef(output, x, y) = imRef(input, x, y);
    }
  }
  return output;  
}

static image<float> *imageINTtoFLOAT(image<int> *input) 
{
  int width = input->width();
  int height = input->height();
  image<float> *output = new image<float>(width, height, false);

  for (int y = 0; y < height; y++)
  {
    for (int x = 0; x < width; x++) 
{
      imRef(output, x, y) = imRef(input, x, y);
    }
  }
  return output;  
}

static image<uchar> *imageFLOATtoUCHAR(image<float> *input, 
       float min, float max)

{
  int width = input->width();
  int height = input->height();
  image<uchar> *output = new image<uchar>(width, height, false);

  if (max == min)
    return output;

  float scale = UCHAR_MAX / (max - min);
  for (int y = 0; y < height; y++) 
  {
    for (int x = 0; x < width; x++) 
{
      uchar val = (uchar)((imRef(input, x, y) - min) * scale);
      imRef(output, x, y) = bound(val, (uchar)0, (uchar)UCHAR_MAX);
    }
  }
  return output;
}

static image<uchar> *imageFLOATtoUCHAR(image<float> *input)
{
  float min, max;
  min_max(input, &min, &max);
  return imageFLOATtoUCHAR(input, min, max);
}

static image<long> *imageUCHARtoLONG(image<uchar> *input) 
{
  int width = input->width();
  int height = input->height();
  image<long> *output = new image<long>(width, height, false);

  for (int y = 0; y < height; y++)
  {
    for (int x = 0; x < width; x++) 
{
      imRef(output, x, y) = imRef(input, x, y);
    }
  }
  return output;  
}

static image<uchar> *imageLONGtoUCHAR(image<long> *input, long min, long max) 
{
  int width = input->width();
  int height = input->height();
  image<uchar> *output = new image<uchar>(width, height, false);

  if (max == min)
    return output;

  float scale = UCHAR_MAX / (float)(max - min);
  for (int y = 0; y < height; y++) 
  {
    for (int x = 0; x < width; x++)
{
      uchar val = (uchar)((imRef(input, x, y) - min) * scale);
      imRef(output, x, y) = bound(val, (uchar)0, (uchar)UCHAR_MAX);
    }
  }
  return output;
}

static image<uchar> *imageLONGtoUCHAR(image<long> *input) 
{
  long min, max;
  min_max(input, &min, &max);
  return imageLONGtoUCHAR(input, min, max);
}

static image<uchar> *imageSHORTtoUCHAR(image<short> *input, 
short min, short max) 
{
  int width = input->width();
  int height = input->height();
  image<uchar> *output = new image<uchar>(width, height, false);

  if (max == min)
    return output;

  float scale = UCHAR_MAX / (float)(max - min);
  for (int y = 0; y < height; y++) 
  {
    for (int x = 0; x < width; x++) 
{
      uchar val = (uchar)((imRef(input, x, y) - min) * scale);
      imRef(output, x, y) = bound(val, (uchar)0, (uchar)UCHAR_MAX);
    }
  }
  return output;
}

static image<uchar> *imageSHORTtoUCHAR(image<short> *input) {
  short min, max;
  min_max(input, &min, &max);
  return imageSHORTtoUCHAR(input, min, max);
}

#endif

#10


這是別人的全局轉換函數,是轉換iamge內部數據類型的,和你之前出錯的地方沒有半毛錢關系。你要參考別人的東西你就參考全套代碼。你要改別人的東西你也要看懂了再改。你少copy了幾個代碼文件,自己也沒搞懂模板編程。很難教得明你。

#11


/* use imRef to access image data. */
#define imRef(im, x, y) (((uchar *)(im->imageData+y*im->widthStep))[x])
   
/* use imPtr to get pointer to image data. */
#define imPtr(im, x, y) &(((uchar *)(im->imageData+y*im->widthStep))[x])

//把這個宏改掉。換成
 #define imRef(im, x, y) (((uchar *)(im->Data+y*im->width))[x])
   
/* use imPtr to get pointer to image data. */
#define imPtr(im, x, y) &(((uchar *)(im->Data+y*im->width))[x])


static image <uchar> *loadPBM(const char *name) 
{
  char buf[BUF_SIZE];
   
  /* read header */
  std::ifstream file(name, std::ios::in | std::ios::binary);
  pnm_read(file, buf);
  if (strncmp(buf, "P4", 2))
    throw pnm_error();
     
  pnm_read(file, buf);
  int width = atoi(buf);
  pnm_read(file, buf);
  int height = atoi(buf);
   
  /* read data */
  image<uchar> *im = new image<uchar>(width, height);
  for (int i = 0; i < height; i++)
    read_packed(imPtr(im, 0, i), width, file);
   
  return im;
}
 
f:\課程資料\圖論\基於圖論的圖像處理\程序\graphsegment\pnmfile.h(104) : error C2039: “imageData”: 不是“image<T>”的成員
1>        with
1>        [
1>            T=uchar
1>        ]

#12


/* use imRef to access image data. */
<span style="color: #FF0000;">#define imRef(im, x, y) (((uchar *)(im->imageData+y*im->widthStep))[x])
    
/* use imPtr to get pointer to image data. */
#define imPtr(im, x, y) &(((uchar *)(im->imageData+y*im->widthStep))[x])</span>
//把這個宏改掉。換成
 <span style="color: #FF0000;">#define imRef(im, x, y) (((uchar *)(im->Data+y*im->width))[x])
    
/* use imPtr to get pointer to image data. */
#define imPtr(im, x, y) &(((uchar *)(im->Data+y*im->width))[x])</span>

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com