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