Wondercoll
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
cv.hpp
Go to the documentation of this file.
1 /*M///////////////////////////////////////////////////////////////////////////////////////
2 //
3 // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4 //
5 // By downloading, copying, installing or using the software you agree to this license.
6 // If you do not agree to this license, do not download, install,
7 // copy or use the software.
8 //
9 //
10 // Intel License Agreement
11 // For Open Source Computer Vision Library
12 //
13 // Copyright (C) 2000, Intel Corporation, all rights reserved.
14 // Third party copyrights are property of their respective owners.
15 //
16 // Redistribution and use in source and binary forms, with or without modification,
17 // are permitted provided that the following conditions are met:
18 //
19 // * Redistribution's of source code must retain the above copyright notice,
20 // this list of conditions and the following disclaimer.
21 //
22 // * Redistribution's in binary form must reproduce the above copyright notice,
23 // this list of conditions and the following disclaimer in the documentation
24 // and/or other materials provided with the distribution.
25 //
26 // * The name of Intel Corporation may not be used to endorse or promote products
27 // derived from this software without specific prior written permission.
28 //
29 // This software is provided by the copyright holders and contributors "as is" and
30 // any express or implied warranties, including, but not limited to, the implied
31 // warranties of merchantability and fitness for a particular purpose are disclaimed.
32 // In no event shall the Intel Corporation or contributors be liable for any direct,
33 // indirect, incidental, special, exemplary, or consequential damages
34 // (including, but not limited to, procurement of substitute goods or services;
35 // loss of use, data, or profits; or business interruption) however caused
36 // and on any theory of liability, whether in contract, strict liability,
37 // or tort (including negligence or otherwise) arising in any way out of
38 // the use of this software, even if advised of the possibility of such damage.
39 //
40 //M*/
41 
42 #ifndef _CV_HPP_
43 #define _CV_HPP_
44 
45 #ifdef __cplusplus
46 
47 /****************************************************************************************\
48 * CvBaseImageFilter: Base class for filtering operations *
49 \****************************************************************************************/
50 
51 #define CV_WHOLE 0
52 #define CV_START 1
53 #define CV_END 2
54 #define CV_MIDDLE 4
55 #define CV_ISOLATED_ROI 8
56 
57 typedef void (*CvRowFilterFunc)( const uchar* src, uchar* dst, void* params );
58 typedef void (*CvColumnFilterFunc)( uchar** src, uchar* dst, int dst_step, int count, void* params );
59 
60 class CV_EXPORTS CvBaseImageFilter
61 {
62 public:
63  CvBaseImageFilter();
64  /* calls init() */
65  CvBaseImageFilter( int _max_width, int _src_type, int _dst_type,
66  bool _is_separable, CvSize _ksize,
67  CvPoint _anchor=cvPoint(-1,-1),
68  int _border_mode=IPL_BORDER_REPLICATE,
69  CvScalar _border_value=cvScalarAll(0) );
70  virtual ~CvBaseImageFilter();
71 
72  /* initializes the class for processing an image of maximal width _max_width,
73  input image has data type _src_type, the output will have _dst_type.
74  _is_separable != 0 if the filter is separable
75  (specific behaviour is defined in a derived class), 0 otherwise.
76  _ksize and _anchor specify the kernel size and the anchor point. _anchor=(-1,-1) means
77  that the anchor is at the center.
78  to get interpolate pixel values outside the image _border_mode=IPL_BORDER_*** is used,
79  _border_value specify the pixel value in case of IPL_BORDER_CONSTANT border mode.
80  before initialization clear() is called if necessary.
81  */
82  virtual void init( int _max_width, int _src_type, int _dst_type,
83  bool _is_separable, CvSize _ksize,
84  CvPoint _anchor=cvPoint(-1,-1),
85  int _border_mode=IPL_BORDER_REPLICATE,
86  CvScalar _border_value=cvScalarAll(0) );
87  /* releases all the internal buffers.
88  for the further use of the object, init() needs to be called. */
89  virtual void clear();
90  /* processes input image or a part of it.
91  input is represented either as matrix (CvMat* src)
92  or a list of row pointers (uchar** src2).
93  in the later case width, _src_y1 and _src_y2 are used to specify the size.
94  _dst is the output image/matrix.
95  _src_roi specifies the roi inside the input image to process,
96  (0,0,-1,-1) denotes the whole image.
97  _dst_origin is the upper-left corner of the filtered roi within the output image.
98  _phase is either CV_START, or CV_END, or CV_MIDDLE, or CV_START|CV_END, or CV_WHOLE,
99  which is the same as CV_START|CV_END.
100  CV_START means that the input is the first (top) stripe of the processed image [roi],
101  CV_END - the input is the last (bottom) stripe of the processed image [roi],
102  CV_MIDDLE - the input is neither first nor last stripe.
103  CV_WHOLE - the input is the whole processed image [roi].
104  */
105  virtual int process( const CvMat* _src, CvMat* _dst,
106  CvRect _src_roi=cvRect(0,0,-1,-1),
107  CvPoint _dst_origin=cvPoint(0,0), int _flags=0 );
108  /* retrieve various parameters of the filtering object */
109  int get_src_type() const { return src_type; }
110  int get_dst_type() const { return dst_type; }
111  int get_work_type() const { return work_type; }
112  CvSize get_kernel_size() const { return ksize; }
113  CvPoint get_anchor() const { return anchor; }
114  int get_width() const { return prev_x_range.end_index - prev_x_range.start_index; }
115  CvRowFilterFunc get_x_filter_func() const { return x_func; }
116  CvColumnFilterFunc get_y_filter_func() const { return y_func; }
117 
118 protected:
119  /* initializes work_type, buf_size and max_rows */
120  virtual void get_work_params();
121  /* it is called (not always) from process when _phase=CV_START or CV_WHOLE.
122  the method initializes ring buffer (buf_end, buf_head, buf_tail, buf_count, rows),
123  prev_width, prev_x_range, const_row, border_tab, border_tab_sz* */
124  virtual void start_process( CvSlice x_range, int width );
125  /* forms pointers to "virtual rows" above or below the processed roi using the specified
126  border mode */
127  virtual void make_y_border( int row_count, int top_rows, int bottom_rows );
128 
129  virtual int fill_cyclic_buffer( const uchar* src, int src_step,
130  int y, int y1, int y2 );
131 
132  enum { ALIGN=32 };
133 
134  int max_width;
135  /* currently, work_type must be the same as src_type in case of non-separable filters */
136  int min_depth, src_type, dst_type, work_type;
137 
138  /* pointers to convolution functions, initialized by init method.
139  for non-separable filters only y_conv should be set */
140  CvRowFilterFunc x_func;
141  CvColumnFilterFunc y_func;
142 
143  uchar* buffer;
144  uchar** rows;
145  int top_rows, bottom_rows, max_rows;
146  uchar *buf_start, *buf_end, *buf_head, *buf_tail;
147  int buf_size, buf_step, buf_count, buf_max_count;
148 
149  bool is_separable;
150  CvSize ksize;
151  CvPoint anchor;
152  int max_ky, border_mode;
153  CvScalar border_value;
154  uchar* const_row;
155  int* border_tab;
156  int border_tab_sz1, border_tab_sz;
157 
158  CvSlice prev_x_range;
159  int prev_width;
160 };
161 
162 
163 /* Derived class, for linear separable filtering. */
164 class CV_EXPORTS CvSepFilter : public CvBaseImageFilter
165 {
166 public:
167  CvSepFilter();
168  CvSepFilter( int _max_width, int _src_type, int _dst_type,
169  const CvMat* _kx, const CvMat* _ky,
170  CvPoint _anchor=cvPoint(-1,-1),
171  int _border_mode=IPL_BORDER_REPLICATE,
172  CvScalar _border_value=cvScalarAll(0) );
173  virtual ~CvSepFilter();
174 
175  virtual void init( int _max_width, int _src_type, int _dst_type,
176  const CvMat* _kx, const CvMat* _ky,
177  CvPoint _anchor=cvPoint(-1,-1),
178  int _border_mode=IPL_BORDER_REPLICATE,
179  CvScalar _border_value=cvScalarAll(0) );
180  virtual void init_deriv( int _max_width, int _src_type, int _dst_type,
181  int dx, int dy, int aperture_size, int flags=0 );
182  virtual void init_gaussian( int _max_width, int _src_type, int _dst_type,
183  int gaussian_size, double sigma );
184 
185  /* dummy method to avoid compiler warnings */
186  virtual void init( int _max_width, int _src_type, int _dst_type,
187  bool _is_separable, CvSize _ksize,
188  CvPoint _anchor=cvPoint(-1,-1),
189  int _border_mode=IPL_BORDER_REPLICATE,
190  CvScalar _border_value=cvScalarAll(0) );
191 
192  virtual void clear();
193  const CvMat* get_x_kernel() const { return kx; }
194  const CvMat* get_y_kernel() const { return ky; }
195  int get_x_kernel_flags() const { return kx_flags; }
196  int get_y_kernel_flags() const { return ky_flags; }
197 
198  enum { GENERIC=0, ASYMMETRICAL=1, SYMMETRICAL=2, POSITIVE=4, SUM_TO_1=8, INTEGER=16 };
199  enum { NORMALIZE_KERNEL=1, FLIP_KERNEL=2 };
200 
201  static void init_gaussian_kernel( CvMat* kernel, double sigma=-1 );
202  static void init_sobel_kernel( CvMat* _kx, CvMat* _ky, int dx, int dy, int flags=0 );
203  static void init_scharr_kernel( CvMat* _kx, CvMat* _ky, int dx, int dy, int flags=0 );
204 
205 protected:
206  CvMat *kx, *ky;
207  int kx_flags, ky_flags;
208 };
209 
210 
211 /* Derived class, for linear non-separable filtering. */
212 class CV_EXPORTS CvLinearFilter : public CvBaseImageFilter
213 {
214 public:
215  CvLinearFilter();
216  CvLinearFilter( int _max_width, int _src_type, int _dst_type,
217  const CvMat* _kernel,
218  CvPoint _anchor=cvPoint(-1,-1),
219  int _border_mode=IPL_BORDER_REPLICATE,
220  CvScalar _border_value=cvScalarAll(0) );
221  virtual ~CvLinearFilter();
222 
223  virtual void init( int _max_width, int _src_type, int _dst_type,
224  const CvMat* _kernel,
225  CvPoint _anchor=cvPoint(-1,-1),
226  int _border_mode=IPL_BORDER_REPLICATE,
227  CvScalar _border_value=cvScalarAll(0) );
228 
229  /* dummy method to avoid compiler warnings */
230  virtual void init( int _max_width, int _src_type, int _dst_type,
231  bool _is_separable, CvSize _ksize,
232  CvPoint _anchor=cvPoint(-1,-1),
233  int _border_mode=IPL_BORDER_REPLICATE,
234  CvScalar _border_value=cvScalarAll(0) );
235 
236  virtual void clear();
237  const CvMat* get_kernel() const { return kernel; }
238  uchar* get_kernel_sparse_buf() { return k_sparse; }
239  int get_kernel_sparse_count() const { return k_sparse_count; }
240 
241 protected:
242  CvMat *kernel;
243  uchar* k_sparse;
244  int k_sparse_count;
245 };
246 
247 
248 /* Box filter ("all 1's", optionally normalized) filter. */
249 class CV_EXPORTS CvBoxFilter : public CvBaseImageFilter
250 {
251 public:
252  CvBoxFilter();
253  CvBoxFilter( int _max_width, int _src_type, int _dst_type,
254  bool _normalized, CvSize _ksize,
255  CvPoint _anchor=cvPoint(-1,-1),
256  int _border_mode=IPL_BORDER_REPLICATE,
257  CvScalar _border_value=cvScalarAll(0) );
258  virtual void init( int _max_width, int _src_type, int _dst_type,
259  bool _normalized, CvSize _ksize,
260  CvPoint _anchor=cvPoint(-1,-1),
261  int _border_mode=IPL_BORDER_REPLICATE,
262  CvScalar _border_value=cvScalarAll(0) );
263 
264  virtual ~CvBoxFilter();
265  bool is_normalized() const { return normalized; }
266  double get_scale() const { return scale; }
267  uchar* get_sum_buf() { return sum; }
268  int* get_sum_count_ptr() { return &sum_count; }
269 
270 protected:
271  virtual void start_process( CvSlice x_range, int width );
272 
273  uchar* sum;
274  int sum_count;
275  bool normalized;
276  double scale;
277 };
278 
279 
280 /* Laplacian operator: (d2/dx + d2/dy)I. */
281 class CV_EXPORTS CvLaplaceFilter : public CvSepFilter
282 {
283 public:
284  CvLaplaceFilter();
285  CvLaplaceFilter( int _max_width, int _src_type, int _dst_type,
286  bool _normalized, int _ksize,
287  int _border_mode=IPL_BORDER_REPLICATE,
288  CvScalar _border_value=cvScalarAll(0) );
289  virtual ~CvLaplaceFilter();
290  virtual void init( int _max_width, int _src_type, int _dst_type,
291  bool _normalized, int _ksize,
292  int _border_mode=IPL_BORDER_REPLICATE,
293  CvScalar _border_value=cvScalarAll(0) );
294 
295  /* dummy methods to avoid compiler warnings */
296  virtual void init( int _max_width, int _src_type, int _dst_type,
297  bool _is_separable, CvSize _ksize,
298  CvPoint _anchor=cvPoint(-1,-1),
299  int _border_mode=IPL_BORDER_REPLICATE,
300  CvScalar _border_value=cvScalarAll(0) );
301 
302  virtual void init( int _max_width, int _src_type, int _dst_type,
303  const CvMat* _kx, const CvMat* _ky,
304  CvPoint _anchor=cvPoint(-1,-1),
305  int _border_mode=IPL_BORDER_REPLICATE,
306  CvScalar _border_value=cvScalarAll(0) );
307 
308  bool is_normalized() const { return normalized; }
309  bool is_basic_laplacian() const { return basic_laplacian; }
310 protected:
311  void get_work_params();
312 
313  bool basic_laplacian;
314  bool normalized;
315 };
316 
317 
318 /* basic morphological operations: erosion & dilation */
319 class CV_EXPORTS CvMorphology : public CvBaseImageFilter
320 {
321 public:
322  CvMorphology();
323  CvMorphology( int _operation, int _max_width, int _src_dst_type,
324  int _element_shape, CvMat* _element,
325  CvSize _ksize=cvSize(0,0), CvPoint _anchor=cvPoint(-1,-1),
326  int _border_mode=IPL_BORDER_REPLICATE,
327  CvScalar _border_value=cvScalarAll(0) );
328  virtual ~CvMorphology();
329  virtual void init( int _operation, int _max_width, int _src_dst_type,
330  int _element_shape, CvMat* _element,
331  CvSize _ksize=cvSize(0,0), CvPoint _anchor=cvPoint(-1,-1),
332  int _border_mode=IPL_BORDER_REPLICATE,
333  CvScalar _border_value=cvScalarAll(0) );
334 
335  /* dummy method to avoid compiler warnings */
336  virtual void init( int _max_width, int _src_type, int _dst_type,
337  bool _is_separable, CvSize _ksize,
338  CvPoint _anchor=cvPoint(-1,-1),
339  int _border_mode=IPL_BORDER_REPLICATE,
340  CvScalar _border_value=cvScalarAll(0) );
341 
342  virtual void clear();
343  const CvMat* get_element() const { return element; }
344  int get_element_shape() const { return el_shape; }
345  int get_operation() const { return operation; }
346  uchar* get_element_sparse_buf() { return el_sparse; }
347  int get_element_sparse_count() const { return el_sparse_count; }
348 
349  enum { RECT=0, CROSS=1, ELLIPSE=2, CUSTOM=100, BINARY = 0, GRAYSCALE=256 };
350  enum { ERODE=0, DILATE=1 };
351 
352  static void init_binary_element( CvMat* _element, int _element_shape,
353  CvPoint _anchor=cvPoint(-1,-1) );
354 protected:
355 
356  void start_process( CvSlice x_range, int width );
357  int fill_cyclic_buffer( const uchar* src, int src_step,
358  int y0, int y1, int y2 );
359  uchar* el_sparse;
360  int el_sparse_count;
361 
362  CvMat *element;
363  int el_shape;
364  int operation;
365 };
366 
367 
369 
370 struct CV_EXPORTS CvLevMarq
371 {
372  CvLevMarq();
373  CvLevMarq( int nparams, int nerrs, CvTermCriteria criteria=
375  bool completeSymmFlag=false );
376  ~CvLevMarq();
377  void init( int nparams, int nerrs, CvTermCriteria criteria=
379  bool completeSymmFlag=false );
380  bool update( const CvMat*& param, CvMat*& J, CvMat*& err );
381  bool updateAlt( const CvMat*& param, CvMat*& JtJ, CvMat*& JtErr, double*& errNorm );
382 
383  void clear();
384  void step();
385  enum { DONE=0, STARTED=1, CALC_J=2, CHECK_ERR=3 };
386 
387  CvMat* mask;
388  CvMat* prevParam;
389  CvMat* param;
390  CvMat* J;
391  CvMat* err;
392  CvMat* JtJ;
393  CvMat* JtJN;
394  CvMat* JtErr;
395  CvMat* JtJV;
396  CvMat* JtJW;
397  double prevErrNorm, errNorm;
398  int lambdaLg10;
400  int state;
401  int iters;
402  bool completeSymmFlag;
403 };
404 
405 #endif /* __cplusplus */
406 
407 #endif /* _CV_HPP_ */
408 
409 /* End of file. */