www.pudn.com > ReadingPeopleTracker-1.28.rar > HSV32Image.h
///////////////////////////////////////////////////////////////////////////////
// //
// HSV32Image.h //
// //
// HSV image class derived from RGB32Image class //
// //
// Author : Nils T Siebel (nts) //
// Created : Thu Apr 19 11:59:19 BST 2001 //
// Revision : 0.0 of Thu Apr 19 11:59:19 BST 2001 //
// Copyright : The University of Reading //
// //
///////////////////////////////////////////////////////////////////////////////
#ifndef __HSV32_IMAGE_H__
#define __HSV32_IMAGE_H__
#include "RGB32Image.h"
#include "tracker_defines_types_and_helpers.h"
namespace ReadingPeopleTracker
{
// write out an HSV32pixel as (h,s,v) triplet
ostream &operator << (ostream &target, HSV32pixel &ColourPixel);
class HSV32Image : public RGB32Image
{
protected:
public:
HSV32Image(unsigned int the_width, unsigned int the_height,
frame_id_t the_frame_id = 0, frame_time_t the_frame_time_in_ms = 0,
unsigned char *the_data = NULL)
: RGB32Image(the_width, the_height,
the_frame_id, the_frame_time_in_ms,
the_data)
{
image_type = HSV32;
// nothing else needed which RGB32Image::RGB32Image does not do
}
// conversion of RGB colour pixels to HSV using algorithm by D Travis.
// 2nd version uses lookup but falls back to the 1st version if no lookup
// table has been set up by the function setup_HSV32_to_RGB32_lookup_table().
static HSV32pixel to_HSV32 (const RGB32pixel *RGBpix);
static HSV32pixel to_HSV32_using_lookup (const RGB32pixel *RGBpix);
// virtual ImageType imgtype() const
// {
// return HSV32;
// }
Image *copy (Image *r = NULL);
inline Image *copy_type(int w = 0, int h = 0)
{
if (w == 0)
w = width;
if (h == 0)
h = height;
return new HSV32Image(w, h);
}
inline Image *virtual_copy(Image *res = NULL) const
{
if (res == NULL)
return new HSV32Image(width, height, frame_id, frame_time_in_ms, data);
else
{
// just copy over our variables
memcpy(res, this, sizeof(*this));
res->own_data = false;
return res;
}
}
// just treat as RGB for now.
// long display(long glw = NULLWIN);
// RGB32Image *rgb_read_image(RGB32Image *res);
// void save_pnm(char *filename);
//// "ColourFilter" to grey --- adapted from RGB32Image class by nts Apr 2001
Image *ColourFilter (Image *res = NULL,
ColourFilteringMethod method
= CF_METHOD_Y_709);
//// "ColourDistance" to grey --- added by nts May 2001
Image *ColourDistance (Image *res = NULL,
ColourDistanceMethod method
= CD_METHOD_V_WEIGHTED_HS);
Image *difference(Image *image2, Image *res = NULL);
Image *difference(Grey8Image *image2, Image *res = NULL);
Image *threshold(unsigned int threshold, Image *res = NULL,
unsigned int *no_marked = NULL);
Image *resample(int xstep, int ystep, Image *resampled = NULL);
Image *mask(Image *mask, Image *res);
void clear(HSV32pixel fill_colour);
void clear_border();
void draw_rectangle(int xmin, int xmax, int ymin, int ymax, int val);
// set up 64 MB lookup table for to_HSV32_using_lookup(RGB32pixel *) :
void setup_HSV32_to_RGB32_lookup_table();
static inline unsigned char colour_distance (
const RGB32pixel RGBpixel1, const RGB32pixel RGBpixel2)
{
HSV32pixel HSVpixel1 = to_HSV32(&RGBpixel1);
HSV32pixel HSVpixel2 = to_HSV32(&RGBpixel2);
register unsigned int H_diff;
if (HSVpixel1.H < HSVpixel2.H)
H_diff = HSVpixel2.H - HSVpixel1.H;
else
H_diff = HSVpixel1.H - HSVpixel2.H;
if (H_diff > 127) // must wrap-around to get angular difference
H_diff = 255 - H_diff;
// NB H_diff is in [0; 127] now
return (H_diff *
ABS(HSVpixel1.S - HSVpixel2.S) *
ABS(HSVpixel1.V - HSVpixel2.V)) / 32768;
}
private:
// private variables and helpers
static const char *RGB32_to_HSV32_lookup_table_filename;
static HSV32pixel *RGB32_to_HSV32_lookup_table;
int compar_char(const void *c1, const void *c2);
unsigned int to_uint(const HSV32pixel colour);
};
} // namespace ReadingPeopleTracker
#endif