region.cc

来自「VC视频对象的跟踪提取原代码(vc视频监控源码)」· CC 代码 · 共 369 行

CC
369
字号
/* * Region.cc * * a Region is a rectangular subimage and * will in general contain one connected blob * * class created 2/3/93 * author: Adam Baumberg * */#include "Region.h"#include <cassert>#include "Image.h"#include "BoundaryPoints.h"// #include "XMLSource.h"#include "Profile.h"#include "Grey8Image.h"#include "text_output.h"#ifndef NO_DISPLAY#ifdef USE_GL#include <gl.h>#else#include <vogl.h>#endif#endif   // #ifndef NO_DISPLAYnamespace ReadingPeopleTracker{// TDG 6/2/98  commented out so that model building uses// vertical axis for alignment better for cars// use principle axis for people// TDG 15/12/98 added REGION_USE_HIGHEST_POINT option// nts 25/10/00 changed to REGION_USE_PRINCIPAL_AXIS for people tracking//#define REGION_USE_DIRECTION#define REGION_USE_PRINCIPAL_AXIS//#define REGION_USE_HIGHEST_POINT// definition and initialisation of static member variablesconst unsigned int Region::start_list[8] = {5,6,7,0,1,2,3,4};const unsigned int Region::end_list[8] = {4,5,6,7,0,1,2,3};const Point2 Region::directions[8] ={    Point2(-1,-1), Point2(-1,0) ,Point2(-1,1),     Point2(0,1), Point2(1,1),     Point2(1,0), Point2(1,-1), Point2(0,-1)};Region::~Region(){    if (region_img != NULL) delete region_img;    if (region_boundary != NULL) delete region_boundary;}Region &Region::operator= (const Region &original){    Observation::operator=(original);        tracker = original.tracker;    // copy over values for normal variables    old_origin = original.old_origin;    direction = original.direction;    xml_blob_data = original.xml_blob_data;    xml_blob_data_available = original.xml_blob_data_available;    inv_grad = original.inv_grad;    incorporated_into_background = original.incorporated_into_background;     // instantiate new classes in order to copy *region_img and *region_boundary...    if (original.region_img != NULL)	region_img = original.region_img->copy();  // instantiates image class        if (original.region_boundary != NULL)    {	region_boundary = new BoundaryPoints(original.region_boundary->get_no_points());	*region_boundary = *original.region_boundary;    }        return *this;};void Region::trace(){    if (region_boundary == NULL)	region_boundary = new BoundaryPoints();    int imgwidth = region_img->get_width();    int imgheight = region_img->get_height();    bool found =  false;    /*int x = imgwidth / 2;      int y;      for (y = 0; y < imgheight && !found; y++)      if (*(region_img->get_pixel(x,y)) != CLEAR_MARK) found = true; */    int x = 0;    int y = 0;    while ((y < imgheight) && (!found))    {	if (*(region_img->get_pixel(x,y)) != CLEAR_MARK)	    found = true;	else	    if ((++x) >= imgwidth)	    {		x = 0;		y++;	    }    }    if (!found)     {	cerror << " Region::trace(): cannot find starting point in region " << endl;	exit(1);    }        region_boundary->add_point( Point2(x,y));    int forward = 1;    int old_tmp = forward;    int tmp = old_tmp;    bool flag;    int loop1;    unsigned char *lpix;    do    {	flag = false;//      forward = (forward+1) & 7;	loop1 = start_list[forward];	while ((loop1 != end_list[forward]) && (flag == false))	{	    Point2 look_dir = directions[(loop1+1)&7];	    if ((region_img->check_coords(x + look_dir.x, y + look_dir.y) == false) ||		*(lpix = region_img->get_pixel(x + (int) look_dir.x,					       y + (int)look_dir.y)) == CLEAR_MARK)		loop1 = (loop1+1) & 7;	    else 	    {		lpix = region_img->get_pixel(x + (int) look_dir.x,					     y + (int) look_dir.y);	    		x += (int) look_dir.x;		y += (int) look_dir.y;		region_boundary->add_point(Point2(x,y));		flag = true;		forward = loop1;		tmp = (loop1+1) & 7;	    }	}		if (flag == false)	{	    Point2 look_dir = directions[(loop1+1)&7];	    if ((region_img->check_coords(x + look_dir.x, y + look_dir.y) == false) ||		*(lpix = region_img->get_pixel(x + (int) look_dir.x,					       y + (int) look_dir.y)) == CLEAR_MARK)	    {		region_boundary->pop();		forward = old_tmp;		Point2* endpoint = region_boundary->last();		x = (int) endpoint->x;		y = (int) endpoint->y;	    }	    else	    {		x += (int) look_dir.x;		y += (int) look_dir.y;		region_boundary->add_point(Point2(x,y));		flag = true;		forward = loop1;		tmp = (loop1+1) & 7;	    }	}	old_tmp = tmp;    }    while ((*(region_boundary->last()) != (*(region_boundary->first())))	   && (region_boundary->get_no_points() < (768+576)*3)); // FIXME: how about a constant?    region_boundary->pop();    region_boundary->find_best_line(inv_grad, origin.x, origin.y);    origin.x += xlo;    origin.y += ylo;}istream &operator>> (istream &strmin, Region &r){     char dummy[128];    strmin >> dummy >> r.xlo >> r.xhi >> r.ylo >> r.yhi;    strmin >> dummy >> r.direction;    return strmin;}ostream &operator<< (ostream &strmout, const Region &r){     strmout << "origin " << r.origin << endl;    strmout << "old_origin " << r.old_origin << endl;    strmout << "width " << r.width << endl;    strmout << "height " << r.height << endl;    strmout << "direction " << r.direction << endl;    return strmout; }//  will allocate memory for a new Profile and return pointer to it or NULLProfile *Region::to_profile(){    // only use measurements, do not use predictions    if (source != MEASUREMENT)	return NULL;        Profile *new_prf;    PointVector tmp_pnts(0);    if (region_boundary == NULL)    {	// region not traced -- use bounding box;	Point2 centre = origin;	realno p_grad = 0.0;		new_prf = new Profile(centre, width, height, p_grad,			   tmp_pnts, direction);    }    else    {	Point2 new_origin;	region_boundary->find_best_line(inv_grad, new_origin.x, new_origin.y);#ifdef REGION_USE_PRINCIPAL_AXIS	Point2 p1 = Point2(inv_grad, 1);	region_boundary->find_end(p1, new_origin);#elif defined REGION_USE_HIGHEST_POINT	region_boundary->find_end_highest(Point2(0,0), new_origin);#elif defined REGION_USE_DIRECTION	if (direction.length2() > 1)	{	    region_boundary->find_end(direction, new_origin);#else	    region_boundary->find_end(Point2(0,1), new_origin);	    inv_grad = 0.0; #endif	    Point2 *origin = new Point2(new_origin + Point2(xlo, ylo));	    		new_prf = new Profile(*origin, 				   width, height,				   inv_grad, tmp_pnts, direction);		//region_boundary->find_optimal_spline(new_prf);		region_boundary->convert_to_spline(new_prf);#ifdef REGION_USE_DIRECTION	}#endif	    }    if (new_prf != NULL)    {	// profile created.  copy over source of information	new_prf->source = source;    }        return new_prf;}int Region::combine(void *pix1, void *pix2){    return (int)	((*((unsigned char*) pix1) * 10  + *((unsigned char*) pix2)) / 11);}int Region::and_pixels (void *pix1, void *pix2){    return (int) (*((unsigned char*) pix1) & *((unsigned char*) pix2));}int Region::or_pixels (void *pix1, void *pix2){    return (int) (*((unsigned char*) pix1) | *((unsigned char*) pix2));}void Region::draw_points(){ #ifndef NO_DISPLAY        get_best_line();    region_boundary->draw_points(xlo,ylo);    move2((float) (-45 * inv_grad + origin.x + xlo), (float) (ylo + origin.y - 45));    draw2((float) (65 * inv_grad + origin.x + xlo), (float) (origin.y + 65 + ylo));#endif   // #ifndef NO_DISPLAY}void Region::merge(Region *reg2){    int nxlo, nxhi, nylo, nyhi;    nxlo = xlo; nxhi = xhi; nylo = ylo; nyhi = yhi;    if (nxlo > (reg2->xlo))	nxlo = reg2->xlo;    if (nxhi < (reg2->xhi))	nxhi = reg2->xhi;    if (nylo > (reg2->ylo))	nylo = reg2->ylo;    if (nyhi < (reg2->yhi))	nyhi = reg2->yhi;        int nwidth = nxhi - nxlo + 1;    int nheight = nyhi - nylo + 1;    if (region_img != NULL)    {	Image *newimage = (Image*) new Grey8Image(nwidth,nheight);		// because the subregions do not cover the whole newimage	newimage->clear(0);		newimage->paste_subimage(xlo - nxlo, xhi - nxlo, ylo - nylo,				 yhi - nylo, region_img);	newimage->paste_subimage(reg2->xlo - nxlo, reg2->xhi - nxlo,				 reg2->ylo - nylo, reg2->yhi - nylo,				 reg2->region_img);	delete region_img;	region_img = newimage;    }    ylo = nylo; yhi = nyhi;    xlo = nxlo; xhi = nxhi;    old_origin = (old_origin + reg2->old_origin) / 2;  // interpolate    origin.x = (xlo + xhi) / 2.0;    origin.y = (ylo + yhi) / 2.0;    width = nwidth;    height = nheight;}void Region::draw_box(){#ifndef NO_DISPLAY    #ifdef USE_GL    if (incorporated_into_background)	setlinestyle(2);        recti(xlo,ylo,xhi,yhi);    setlinestyle(0);#endif#endif   // #ifndef NO_DISPLAY}void Region::draw_box_in_image(Image *canvas,			       unsigned int line_width){    bool dotted;        if (incorporated_into_background)	dotted = true;    else	dotted = false;    // in the following we add something to image coordinates, so check    assert (xlo < xhi);    assert (ylo < yhi);        for (unsigned int count = 0; count < line_width; count++)    {	canvas->draw_vertical(xlo + count, ylo, yhi, dotted);	canvas->draw_vertical(xhi - count, ylo, yhi, dotted);		canvas->draw_horizontal(ylo + count, xlo, xhi, dotted);	canvas->draw_horizontal(yhi - count, xlo, xhi, dotted);    }}} // namespace ReadingPeopleTracker

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?