pipesourcefilters.h
来自「VC视频对象的跟踪提取原代码(vc视频监控源码)」· C头文件 代码 · 共 1,086 行 · 第 1/2 页
H
1,086 行
// This is file PipeSourceFilters.h, created by nts on Mon Feb 25 16:47:13 GMT 2002//////// NB do not include this file directly. We are included by PipeSource.h////#ifndef __PIPE_SOURCE_FILTERS_H__#define __PIPE_SOURCE_FILTERS_H__namespace ReadingPeopleTracker{///// constant ////// --- added by nts, end 2000class ConstantSource : public ImageSource{protected: Image *ConstantImage; public: Image *get_next() { // do not change the image (constant...) but the frame id and time... frame_id_t new_frame_id = current->get_frame_id() + 1; // FIXME: should be + frame_id_delta #if (MAX_FRAME_ID - FRAME_ID_T_MAX) > 0 // the following makes no sense if MAX_FRAME_ID == FRAME_ID_T_MAX if (new_frame_id > MAX_FRAME_ID) new_frame_id %= (MAX_FRAME_ID + 1);#endif current->set_frame_id(new_frame_id); // use our default frame rate current->set_frame_time_in_ms(current->get_frame_time_in_ms() + default_frame_time_in_ms); frame_count++; return current = ConstantImage; } virtual unsigned int get_xdim() const { return ConstantImage->get_width(); } virtual unsigned int get_ydim() const { return ConstantImage->get_height(); } virtual ImageType get_image_type() const { return ConstantImage->get_image_type(); } ConstantSource(Image *const_image) { assert (const_image != NULL); // who would want a constant NULL source? // this creates a new image current = ConstantImage = const_image->copy(); }}; /****** resample *****/class ResampleSource : public PipeSource{protected: unsigned int xstep; unsigned int ystep; inline Image *recalc() { return in->get_current()->resample(xstep, ystep, current); }public: ResampleSource(ImageSource *source, unsigned int the_xstep, unsigned int the_ystep) : PipeSource(source) { xstep = the_xstep; ystep = the_ystep; in = source;// refresh(); }};/****** rotate *****/class RotateSource : public PipeSource{protected: int xcentre, ycentre; realno angle, scale; Image *recalc() { if ((xcentre == -1) && (in->get_current() != NULL)) xcentre = in->get_current()->get_width() / 2; if ((ycentre == -1) && (in->get_current() != NULL)) ycentre = in->get_current()->get_height() / 2; return in->get_current()->transform(xcentre, ycentre, angle, scale, current); } public: RotateSource(ImageSource *source, int xc = -1, int yc =-1, realno ang = 3.14159265358979 / 2, realno sc = 1.0) : PipeSource(source) { xcentre = xc; ycentre = yc; angle = ang; scale = sc; in = source;// refresh(); } RotateSource(ImageSource *source, realno ang, realno sc = 1.0) : PipeSource(source) { xcentre = ycentre = -1; angle = ang; scale = sc; in = source;// refresh(); } inline realno get_angle() { return angle; } inline void set_angle(realno theta) { angle = theta; }};/****** convolve *****/class ConvolveSource : public PipeSource{protected: inline Image *recalc() { return in->get_current()->convolve(kern, current); } Kernel kern;public: ConvolveSource(ImageSource *source, Kernel k) : PipeSource(source) { kern = k; in = source;// refresh(); }};/***** blur *****/class BlurSource : public PipeSource{protected: inline Image *recalc() { return in->get_current()->blur(current); } public: BlurSource(ImageSource *source) : PipeSource(source) { in = source;// refresh(); }};/***** half_blur *****/class HalfBlurSource : public PipeSource{protected: inline Image *recalc() { return in->get_current()->half_blur(current); } public: HalfBlurSource(ImageSource *source) : PipeSource(source) { in = source;// refresh(); }};/***** middle *****/class MiddleSource : public PipeSource{protected: inline Image *recalc() { Image *original = in->get_current(); if (original == NULL) current = NULL; else current = original->middle(current); return current; } public: MiddleSource(ImageSource *source) : PipeSource(source) { in = source;// refresh(); }};/***** neighbour ordered *****/// sorts each pixel and all 8 neighbours and gives n'th of these 9 valuesclass NeighbourSource : public PipeSource{ unsigned int position; // position 1 to 9 in the 9 values to return protected: inline Image *recalc() { Image *original = in->get_current(); if (original == NULL) current = NULL; else current = original->neighbour_order(position, current); return current; } public: NeighbourSource(ImageSource *source, unsigned int the_position) : PipeSource(source) { assert (the_position > 0); // this should be an ordinal number assert (the_position < 10); // there are only 9 values position = the_position; in = source;// refresh(); }};/***** fmed *****/class FMedSource : public PipeSource{protected: inline Image *recalc() { return in->get_current()->fmed(current); } public: FMedSource(ImageSource *source) : PipeSource(source) { in = source;// refresh(); }};/***** minimum *****/class MinimumSource : public PipeSource{protected: inline Image *recalc() { return in->get_current()->minimum(current); } public: MinimumSource(ImageSource *source) : PipeSource(source) { in = source;// refresh(); }};/***** maximum *****/class MaximumSource : public PipeSource{protected: inline Image *recalc() { return in->get_current()->maximum(current); } public: MaximumSource(ImageSource *source) : PipeSource(source) { in = source;// refresh(); }};/***** sobel (thresholded) *****/class SobelEdgeSource : public PipeSource{protected: inline Image *recalc() { return in->get_current()->sobel(threshold, current); } public: unsigned int threshold; SobelEdgeSource(ImageSource *source, unsigned int thresh = 20) : PipeSource (source) { threshold = thresh; in = source;// refresh(); }};/***** sobel (unthresholded) *****/class SobelSource : public PipeSource{protected: inline Image *recalc() { return in->get_current()->sobel(current); } public: SobelSource(ImageSource *source) : PipeSource(source) { in = source;// refresh(); }};/***** threshold *****/class ThresholdSource : public PipeSource{protected: inline Image *recalc() { return in->get_current()->threshold(threshold, current, &no_marked); } public: unsigned char threshold; unsigned int no_marked; ThresholdSource(ImageSource *source, unsigned char thresh) : PipeSource(source) { threshold = thresh; in = source;// refresh(); }};/***** sub_image *****/class SubImageSource : public PipeSource{protected: unsigned int xmin; unsigned int xmax; unsigned int ymin; unsigned int ymax; inline Image *recalc() { return in->get_current()->extract_subimage(xmin, xmax, ymin, ymax); } public: SubImageSource(ImageSource *the_source, unsigned int the_xmin, unsigned int the_xmax, unsigned int the_ymin, unsigned int the_ymax) : PipeSource(the_source) { xmin = the_xmin; xmax = the_xmax; ymin = the_ymin; ymax = the_ymax; in = the_source;// refresh(); }};#ifdef _SVID_SOURCE// the following uses SVID 48-bit random numbers.../***** NoisySource *****/class NoisySource : public PipeSource{protected: inline Image *recalc() { Image *ret_img = in->get_current() ->add_gaussian_noise(sd, noise, current); total_noise += noise; return ret_img; } public: realno sd; realno noise; realno total_noise; NoisySource(ImageSource *source, int sdev) : PipeSource(source) { sd = sdev; in = source; total_noise = 0; }};#endif // ifdef _SVID_SOURCE/***** difference image (abs source1-source2) *****/class DifferenceSource : public PipeSource /// (nts) was an ImageSource{protected: ImageSource *source1; ImageSource *source2; inline Image *recalc() { return source1->get_current()->difference (source2->get_current(), current); }public: inline virtual Image *refresh() { if ((source1->get_current() == NULL) || (source2->get_current() == NULL)) return NULL; else return current = recalc(); } inline virtual Image *get_next() {// // frame_id++;// if ((source1->get_next() == NULL) || (source2->get_next() == NULL))// return NULL;// else frame_count++; return get_current(); // automatically follow in's new frame_id } inline virtual Image *get_current() { // match frame id to parents' frame id if ((current != NULL) && // we have a valid image (current->get_frame_id() == MAX(source1->get_source_frame_id(), source2->get_source_frame_id()))) // and are up to date ? { // then do not spend any CPU time on re-calculating return current; } source1->get_current(); // recursive update as necessary source2->get_current(); // recursive update as necessary current = recalc(); current->set_frame_id(MAX(source1->get_source_frame_id(), source2->get_source_frame_id())); current->set_frame_time_in_ms(MAX(source1->get_source_frame_time_in_ms(), source2->get_source_frame_time_in_ms())); return current; } DifferenceSource(ImageSource *s1, ImageSource *s2) : PipeSource(s1) ///, PipeSource(s2) { in = source1 = s1; source2 = s2; }};/***** thresholded difference *****/class ThresholdedDifferenceSource : public PipeSource /// (nts) was ImageSource{protected: ImageSource *source1; ImageSource *source2; public: realno threshold; protected: inline Image *recalc() { return source1->get_current() ->difference(source2->get_current(), threshold, current); } public: inline Image *refresh() { if ((source1->get_current() == NULL) || (source2->get_current() == NULL)) return NULL; else return current = recalc(); } inline virtual Image *get_next() {// // frame_id++;// if ((source1->get_next() == NULL) || (source2->get_next() == NULL))// return NULL; // else frame_count++; return get_current(); // automatically follow in's new frame_id } inline Image *get_current() { // match frame id to parents' frame id if ((current != NULL) && // we have a valid image (current->get_frame_id() == MAX(source1->get_source_frame_id(), source2->get_source_frame_id()))) // and are up to date ? { // then do not spend any CPU time on re-calculating return current; } source1->get_current(); // recursive update as necessary source2->get_current(); // recursive update as necessary current = recalc(); current->set_frame_id(MAX(source1->get_source_frame_id(), source2->get_source_frame_id())); current->set_frame_time_in_ms(MAX(source1->get_source_frame_time_in_ms(), source2->get_source_frame_time_in_ms())); return current; } ThresholdedDifferenceSource(ImageSource *s1, ImageSource *s2, realno thresh = -1) : PipeSource(s1) ///, PipeSource(s2)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?