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 57typedef void (*CvRowFilterFunc)( const uchar* src, uchar* dst, void* params ); 58typedef void (*CvColumnFilterFunc)( uchar** src, uchar* dst, int dst_step, int count, void* params ); 59 60class CV_EXPORTS CvBaseImageFilter 61{ 62public: 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 118protected: 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. */ 164class CV_EXPORTS CvSepFilter : public CvBaseImageFilter 165{ 166public: 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 205protected: 206 CvMat *kx, *ky; 207 int kx_flags, ky_flags; 208}; 209 210 211/* Derived class, for linear non-separable filtering. */ 212class CV_EXPORTS CvLinearFilter : public CvBaseImageFilter 213{ 214public: 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 241protected: 242 CvMat *kernel; 243 uchar* k_sparse; 244 int k_sparse_count; 245}; 246 247 248/* Box filter ("all 1's", optionally normalized) filter. */ 249class CV_EXPORTS CvBoxFilter : public CvBaseImageFilter 250{ 251public: 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 270protected: 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. */ 281class CV_EXPORTS CvLaplaceFilter : public CvSepFilter 282{ 283public: 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; } 310protected: 311 void get_work_params(); 312 313 bool basic_laplacian; 314 bool normalized; 315}; 316 317 318/* basic morphological operations: erosion & dilation */ 319class CV_EXPORTS CvMorphology : public CvBaseImageFilter 320{ 321public: 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) ); 354protected: 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 368////////////////////////////////////////////////////////////////////////////////////////// 369 370struct CV_EXPORTS CvLevMarq 371{ 372 CvLevMarq(); 373 CvLevMarq( int nparams, int nerrs, CvTermCriteria criteria= 374 cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,30,DBL_EPSILON), 375 bool completeSymmFlag=false ); 376 ~CvLevMarq(); 377 void init( int nparams, int nerrs, CvTermCriteria criteria= 378 cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,30,DBL_EPSILON), 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; 399 CvTermCriteria criteria; 400 int state; 401 int iters; 402 bool completeSymmFlag; 403}; 404 405#endif /* __cplusplus */ 406 407#endif /* _CV_HPP_ */ 408 409/* End of file. */ 410