1 /*M///////////////////////////////////////////////////////////////////////////////////////
3 // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
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.
10 // Intel License Agreement
11 // For Open Source Computer Vision Library
13 // Copyright (C) 2000, Intel Corporation, all rights reserved.
14 // Third party copyrights are property of their respective owners.
16 // Redistribution and use in source and binary forms, with or without modification,
17 // are permitted provided that the following conditions are met:
19 // * Redistribution's of source code must retain the above copyright notice,
20 // this list of conditions and the following disclaimer.
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.
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.
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.
45 #if 0 && (defined __cplusplus && (_MSC_VER>=1200 || defined __BORLANDC__ || defined __GNUC__))
48 #pragma warning( disable: 4710 ) /* suppress "function ... is not inlined" */
57 /****************************************************************************************\
58 * C++ - like operations on CvScalar *
59 \****************************************************************************************/
61 inline CvScalar& operator += ( CvScalar& a, const CvScalar& b )
63 double t0 = a.val[0] + b.val[0];
64 double t1 = a.val[1] + b.val[1];
68 t0 = a.val[2] + b.val[2];
69 t1 = a.val[3] + b.val[3];
77 inline CvScalar& operator -= ( CvScalar& a, const CvScalar& b )
79 double t0 = a.val[0] - b.val[0];
80 double t1 = a.val[1] - b.val[1];
84 t0 = a.val[2] - b.val[2];
85 t1 = a.val[3] - b.val[3];
93 inline CvScalar& operator *= ( CvScalar& a, double b )
95 double t0 = a.val[0] * b;
96 double t1 = a.val[1] * b;
109 inline CvScalar& operator /= ( CvScalar& a, double b )
112 double t0 = a.val[0] * inv_b;
113 double t1 = a.val[1] * inv_b;
117 t0 = a.val[2] * inv_b;
118 t1 = a.val[3] * inv_b;
126 inline CvScalar& operator *= ( CvScalar& a, const CvScalar& b )
128 double t0 = a.val[0]*b.val[0] - a.val[1]*b.val[1] -
129 a.val[2]*b.val[2] - a.val[3]*b.val[3];
131 double t1 = a.val[0]*b.val[1] + a.val[1]*b.val[0] +
132 a.val[2]*b.val[3] - a.val[3]*b.val[2];
134 double t2 = a.val[0]*b.val[2] - a.val[1]*b.val[3] +
135 a.val[2]*b.val[0] + a.val[3]*b.val[1];
137 double t3 = a.val[0]*b.val[3] + a.val[1]*b.val[2] -
138 a.val[2]*b.val[1] + a.val[3]*b.val[0];
149 inline CvScalar& operator /= ( CvScalar& a, const CvScalar& b )
151 double inv_d = -1./(b.val[0]*b.val[0] + b.val[1]*b.val[1] +
152 b.val[2]*b.val[2] + b.val[3]*b.val[3]);
153 return a *= cvScalar( b.val[0] * -inv_d, b.val[1] * inv_d,
154 b.val[2] * inv_d, b.val[3] * inv_d );
158 inline CvScalar& operator += ( CvScalar& a, double b )
165 inline CvScalar& operator -= ( CvScalar& a, double b )
172 inline CvScalar operator + ( const CvScalar& a, const CvScalar& b )
174 return cvScalar( a.val[0] + b.val[0], a.val[1] + b.val[1],
175 a.val[2] + b.val[2], a.val[3] + b.val[3] );
179 inline CvScalar operator - ( const CvScalar& a, const CvScalar& b )
181 return cvScalar( a.val[0] - b.val[0], a.val[1] - b.val[1],
182 a.val[2] - b.val[2], a.val[3] - b.val[3] );
186 inline CvScalar operator + ( const CvScalar& a, double b )
188 return cvScalar( a.val[0] + b, a.val[1], a.val[2], a.val[3] );
192 inline CvScalar operator - ( const CvScalar& a, double b )
194 return cvScalar( a.val[0] - b, a.val[1], a.val[2], a.val[3] );
198 inline CvScalar operator + ( double a, const CvScalar& b )
200 return cvScalar( a + b.val[0], b.val[1], b.val[2], b.val[3] );
204 inline CvScalar operator - ( double a, const CvScalar& b )
206 return cvScalar( a - b.val[0], -b.val[1], -b.val[2], -b.val[3] );
210 inline CvScalar operator - ( const CvScalar& b )
212 return cvScalar( -b.val[0], -b.val[1], -b.val[2], -b.val[3] );
216 inline CvScalar operator * ( const CvScalar& a, const CvScalar& b )
224 inline CvScalar operator * ( const CvScalar& a, double b )
226 return cvScalar( a.val[0]*b, a.val[1]*b, a.val[2]*b, a.val[3]*b );
230 inline CvScalar operator * ( double a, const CvScalar& b )
232 return cvScalar( b.val[0]*a, b.val[1]*a, b.val[2]*a, b.val[3]*a );
236 inline CvScalar operator / ( const CvScalar& a, const CvScalar& b )
243 inline CvScalar operator / ( const CvScalar& a, double b )
246 return cvScalar( a.val[0]*inv_b, a.val[1]*inv_b,
247 a.val[2]*inv_b, a.val[3]*inv_b );
251 inline CvScalar operator / ( double a, const CvScalar& b )
253 double inv_d = -a/(b.val[0]*b.val[0] + b.val[1]*b.val[1] +
254 b.val[2]*b.val[2] + b.val[3]*b.val[3]);
255 return cvScalar( b.val[0] * -inv_d, b.val[1] * inv_d,
256 b.val[2] * inv_d, b.val[3] * inv_d );
260 inline CvScalar& operator &= ( CvScalar& a, const CvScalar& b )
262 int t0 = cvRound(a.val[0]) & cvRound(b.val[0]);
263 int t1 = cvRound(a.val[1]) & cvRound(b.val[1]);
267 t0 = cvRound(a.val[2]) & cvRound(b.val[2]);
268 t1 = cvRound(a.val[3]) & cvRound(b.val[3]);
276 inline CvScalar& operator |= ( CvScalar& a, const CvScalar& b )
278 int t0 = cvRound(a.val[0]) | cvRound(b.val[0]);
279 int t1 = cvRound(a.val[1]) | cvRound(b.val[1]);
283 t0 = cvRound(a.val[2]) | cvRound(b.val[2]);
284 t1 = cvRound(a.val[3]) | cvRound(b.val[3]);
292 inline CvScalar& operator ^= ( CvScalar& a, const CvScalar& b )
294 int t0 = cvRound(a.val[0]) ^ cvRound(b.val[0]);
295 int t1 = cvRound(a.val[1]) ^ cvRound(b.val[1]);
299 t0 = cvRound(a.val[2]) ^ cvRound(b.val[2]);
300 t1 = cvRound(a.val[3]) ^ cvRound(b.val[3]);
308 inline CvScalar operator & ( const CvScalar& a, const CvScalar& b )
315 inline CvScalar operator | ( const CvScalar& a, const CvScalar& b )
322 inline CvScalar operator ^ ( const CvScalar& a, const CvScalar& b )
329 inline CvScalar operator ~ ( const CvScalar& a )
331 return cvScalar( ~cvRound(a.val[0]), ~cvRound(a.val[1]),
332 ~cvRound(a.val[2]), ~cvRound(a.val[3]));
336 /****************************************************************************************\
338 \****************************************************************************************/
340 struct _CvMATConstElem_;
342 struct _CvMATElemCn_;
347 struct _CvMAT_SCALE_;
348 struct _CvMAT_SCALE_SHIFT_;
350 struct _CvMAT_ADD_EX_;
351 struct _CvMAT_MUL_ADD_;
352 struct _CvMAT_LOGIC_;
353 struct _CvMAT_UN_LOGIC_;
357 struct _CvMAT_DOT_OP_;
358 struct _CvMAT_SOLVE_;
361 class CV_EXPORTS CvMAT : public CvMat
366 /* helper methods for retrieving/setting matrix elements */
367 static double get( const uchar* ptr, int type, int coi = 0 );
368 static void set( uchar* ptr, int type, int coi, double d );
369 static void set( uchar* ptr, int type, int coi, int i );
370 static void set( uchar* ptr, int type, double d );
371 static void set( uchar* ptr, int type, int i );
373 /******************* constructors ********************/
378 explicit CvMAT( int rows, int cols, int type, void* data, int step = CV_AUTOSTEP );
379 explicit CvMAT( int rows, int type, void* data, int step = CV_AUTOSTEP );
380 explicit CvMAT( int rows, int cols, int type );
381 explicit CvMAT( int rows, int type );
383 /* extracting part of an existing matrix */
384 explicit CvMAT( const CvMat& mat, CvRect rect ); /* submatrix */
385 explicit CvMAT( const CvMat& mat, int k, int i ); /* submatrix:
388 k < 0 - i-th diagonal */
390 CvMAT( const CvMat& mat );
391 CvMAT( const CvMAT& mat );
392 CvMAT( const IplImage& img );
394 /* CvMAT b = op(a1,a2,...) */
395 explicit CvMAT( const _CvMAT_T_& mat_t );
396 explicit CvMAT( const _CvMAT_INV_& inv_mat );
397 explicit CvMAT( const _CvMAT_ADD_& mat_add );
398 explicit CvMAT( const _CvMAT_ADD_EX_& mat_add );
399 explicit CvMAT( const _CvMAT_SCALE_& scale_mat );
400 explicit CvMAT( const _CvMAT_SCALE_SHIFT_& scale_shift_mat );
401 explicit CvMAT( const _CvMAT_MUL_& mmul );
402 explicit CvMAT( const _CvMAT_MUL_ADD_& mmuladd );
403 explicit CvMAT( const _CvMAT_LOGIC_& mat_logic );
404 explicit CvMAT( const _CvMAT_UN_LOGIC_& mat_logic );
405 explicit CvMAT( const _CvMAT_NOT_& not_mat );
406 explicit CvMAT( const _CvMAT_COPY_& mat_copy );
407 explicit CvMAT( const _CvMAT_CVT_& mat_copy );
408 explicit CvMAT( const _CvMAT_DOT_OP_& dot_mul );
409 explicit CvMAT( const _CvMAT_SOLVE_& solve_mat );
410 explicit CvMAT( const _CvMAT_CMP_& cmp_mat );
415 /* copying and filling with a constant */
416 CvMAT& operator = ( const CvMAT& mat );
417 CvMAT& operator = ( const CvMat& mat );
418 CvMAT& operator = ( const IplImage& img );
419 CvMAT& operator = ( double fillval );
420 CvMAT& operator = ( const CvScalar& fillval );
422 /* b = op(a1, a2,...) */
423 CvMAT& operator = ( const _CvMAT_T_& mat_t );
424 CvMAT& operator = ( const _CvMAT_INV_& inv_mat );
425 CvMAT& operator = ( const _CvMAT_ADD_& mat_add );
426 CvMAT& operator = ( const _CvMAT_ADD_EX_& mat_add );
427 CvMAT& operator = ( const _CvMAT_SCALE_& scale_mat );
428 CvMAT& operator = ( const _CvMAT_SCALE_SHIFT_& scale_shift_mat );
429 CvMAT& operator = ( const _CvMAT_MUL_& mmul );
430 CvMAT& operator = ( const _CvMAT_MUL_ADD_& mmuladd );
431 CvMAT& operator = ( const _CvMAT_LOGIC_& mat_logic );
432 CvMAT& operator = ( const _CvMAT_UN_LOGIC_& mat_logic );
433 CvMAT& operator = ( const _CvMAT_NOT_& not_mat );
434 CvMAT& operator = ( const _CvMAT_DOT_OP_& dot_mul );
435 CvMAT& operator = ( const _CvMAT_SOLVE_& solve_mat );
436 CvMAT& operator = ( const _CvMAT_CMP_& cmp_mat );
437 CvMAT& operator = ( const _CvMAT_CVT_& mat_cvt );
439 /* copy matrix data, not only matrix header */
440 CvMAT& operator = ( const _CvMAT_COPY_& mat_copy );
442 /* augmented assignments */
443 CvMAT& operator += ( const CvMat& mat );
444 CvMAT& operator += ( double val );
445 CvMAT& operator += ( const CvScalar& val );
446 CvMAT& operator += ( const _CvMAT_SCALE_& scale_mat );
447 CvMAT& operator += ( const _CvMAT_SCALE_SHIFT_& scale_mat );
448 CvMAT& operator += ( const _CvMAT_MUL_& mmul );
450 CvMAT& operator -= ( const CvMat& mat );
451 CvMAT& operator -= ( double val );
452 CvMAT& operator -= ( const CvScalar& val );
453 CvMAT& operator -= ( const _CvMAT_SCALE_& scale_mat );
454 CvMAT& operator -= ( const _CvMAT_SCALE_SHIFT_& scale_mat );
455 CvMAT& operator -= ( const _CvMAT_MUL_& mmul );
457 CvMAT& operator *= ( const CvMat& mat );
458 CvMAT& operator *= ( double val );
459 CvMAT& operator *= ( const CvScalar& val );
460 CvMAT& operator *= ( const _CvMAT_SCALE_& scale_mat );
461 CvMAT& operator *= ( const _CvMAT_SCALE_SHIFT_& scale_mat );
463 CvMAT& operator &= ( const CvMat& mat );
464 CvMAT& operator &= ( double val );
465 CvMAT& operator &= ( const CvScalar& val );
467 CvMAT& operator |= ( const CvMat& mat );
468 CvMAT& operator |= ( double val );
469 CvMAT& operator |= ( const CvScalar& val );
471 CvMAT& operator ^= ( const CvMat& mat );
472 CvMAT& operator ^= ( double val );
473 CvMAT& operator ^= ( const CvScalar& val );
475 /* various scalar charactertics */
476 double norm( int norm_type = CV_L2 ) const;
477 double norm( CvMat& mat, int norm_type = CV_L2 ) const;
478 CvScalar sum() const;
481 double trace() const;
483 _CvMAT_T_ t() const; /* transposition */
484 _CvMAT_INV_ inv(int method = 0) const;
485 /* inversion using one of the following methods:
486 method = 0 - Gaussian elimination,
489 _CvMAT_DOT_OP_ mul( const CvMAT& mat ) const;
490 _CvMAT_DOT_OP_ mul( const _CvMAT_SCALE_& mat ) const;
492 _CvMAT_DOT_OP_ div( const CvMAT& mat ) const;
493 _CvMAT_DOT_OP_ div( const _CvMAT_SCALE_& mat ) const;
495 _CvMAT_DOT_OP_ min( const CvMAT& mat ) const;
496 _CvMAT_DOT_OP_ max( const CvMAT& mat ) const;
497 _CvMAT_DOT_OP_ min( double value ) const;
498 _CvMAT_DOT_OP_ max( double value ) const;
499 double min( CvPoint* minloc = 0 ) const;
500 double max( CvPoint* maxloc = 0 ) const;
502 _CvMAT_DOT_OP_ abs() const;
504 /* accessing matrix elements */
505 _CvMATElem_ operator ()( int row );
506 _CvMATConstElem_ operator ()( int row ) const;
508 _CvMATElem_ operator ()( int row, int col );
509 _CvMATConstElem_ operator ()( int row, int col ) const;
511 _CvMATElem_ operator ()( CvPoint loc );
512 _CvMATConstElem_ operator ()( CvPoint loc ) const;
514 _CvMATElemCn_ operator()( int row, int col, int coi );
515 double operator()( int row, int col, int coi ) const;
517 _CvMATElemCn_ operator()( CvPoint pt, int coi );
518 double operator()( CvPoint pt, int coi ) const;
520 void* ptr( int row );
521 const void* ptr( int row ) const;
523 void* ptr( int row, int col );
524 const void* ptr( int row, int col ) const;
526 void* ptr( CvPoint pt );
527 const void* ptr( CvPoint pt ) const;
529 /* accessing matrix parts */
530 CvMAT row( int row ) const;
531 CvMAT rowrange( int row1, int row2 ) const;
532 CvMAT col( int col ) const;
533 CvMAT colrange( int col1, int col2 ) const;
534 CvMAT rect( CvRect rect ) const;
535 CvMAT diag( int diag = 0 ) const;
537 _CvMAT_COPY_ clone() const;
540 _CvMAT_CVT_ cvt( int newdepth = -1, double scale = 1,
541 double shift = 0 ) const;
543 /* matrix transformation */
544 void reshape( int newcn, int newrows = 0 );
549 /* matrix I/O: use dynamically linked runtime libraries */
550 void write( const char* name = 0, FILE* f = 0, const char* fmt = 0 );
551 void read( char** name = 0, FILE* f = 0 );
553 /* decrease matrix data reference counter and clear data pointer */
557 void create( int rows, int cols, int type );
561 /* !!! Internal Use Only !!! */
562 /* proxies for matrix elements */
565 struct CV_EXPORTS _CvMATConstElem_
567 explicit _CvMATConstElem_( const uchar* ptr, int type );
568 operator CvScalar () const;
569 double operator ()( int coi = 0 ) const;
576 /* A(i,j,cn) or A(i,j)(cn) */
577 struct CV_EXPORTS _CvMATElemCn_
579 explicit _CvMATElemCn_( uchar* ptr, int type, int coi );
580 operator double() const;
582 _CvMATElemCn_& operator = ( const _CvMATConstElem_& elem );
583 _CvMATElemCn_& operator = ( const _CvMATElemCn_& elem );
584 _CvMATElemCn_& operator = ( const CvScalar& scalar );
585 _CvMATElemCn_& operator = ( double d );
586 _CvMATElemCn_& operator = ( float f );
587 _CvMATElemCn_& operator = ( int i );
595 struct CV_EXPORTS _CvMATElem_ : public _CvMATConstElem_
597 explicit _CvMATElem_( uchar* ptr, int type );
598 _CvMATElemCn_ operator ()( int coi = 0 );
600 _CvMATElem_& operator = ( const _CvMATConstElem_& elem );
601 _CvMATElem_& operator = ( const _CvMATElem_& elem );
602 _CvMATElem_& operator = ( const _CvMATElemCn_& elem );
603 _CvMATElem_& operator = ( const CvScalar& val );
604 _CvMATElem_& operator = ( double d );
605 _CvMATElem_& operator = ( float f );
606 _CvMATElem_& operator = ( int i );
610 struct CV_EXPORTS _CvMAT_BASE_OP_
612 _CvMAT_BASE_OP_() {};
613 virtual operator CvMAT() const = 0;
615 _CvMAT_DOT_OP_ mul( const CvMAT& a ) const;
616 _CvMAT_DOT_OP_ mul( const _CvMAT_SCALE_& a ) const;
618 _CvMAT_DOT_OP_ div( const CvMAT& a ) const;
619 _CvMAT_DOT_OP_ div( const _CvMAT_SCALE_& a ) const;
621 _CvMAT_DOT_OP_ max( const CvMAT& a ) const;
622 _CvMAT_DOT_OP_ min( const CvMAT& a ) const;
624 _CvMAT_DOT_OP_ max( double value ) const;
625 _CvMAT_DOT_OP_ min( double value ) const;
627 double max( CvPoint* maxloc = 0 ) const;
628 double min( CvPoint* minloc = 0 ) const;
630 _CvMAT_DOT_OP_ abs() const;
632 _CvMAT_INV_ inv( int method = 0 ) const;
635 CvMAT row( int row ) const;
636 CvMAT rowrange( int row1, int row2 ) const;
637 CvMAT col( int col ) const;
638 CvMAT colrange( int col1, int col2 ) const;
639 CvMAT rect( CvRect rect ) const;
640 CvMAT diag( int diag = 0 ) const;
641 _CvMAT_CVT_ cvt( int newdepth = -1, double scale = 1, double shift = 0 ) const;
643 double norm( int norm_type = CV_L2 ) const;
645 double trace() const;
646 CvScalar sum() const;
651 struct CV_EXPORTS _CvMAT_T_ : public _CvMAT_BASE_OP_
653 explicit _CvMAT_T_( const CvMAT* a );
654 explicit _CvMAT_T_( const CvMAT* a, double alpha );
657 double norm( int normType = CV_L2 ) const;
658 operator CvMAT() const;
666 struct CV_EXPORTS _CvMAT_INV_ : public _CvMAT_BASE_OP_
668 explicit _CvMAT_INV_( const CvMAT* mat, int method );
669 operator CvMAT() const;
676 /* (A^ta)*(B^tb)*alpha */
677 struct CV_EXPORTS _CvMAT_MUL_ : public _CvMAT_BASE_OP_
679 explicit _CvMAT_MUL_( const CvMAT* a, const CvMAT* b, int t_ab );
680 explicit _CvMAT_MUL_( const CvMAT* a, const CvMAT* b,
681 double alpha, int t_abc );
682 operator CvMAT() const;
687 int t_ab; /* (t_ab & 1) = ta, (t_ab & 2) = tb */
691 /* (A^ta)*(B^tb)*alpha + (C^tc)*beta */
692 struct CV_EXPORTS _CvMAT_MUL_ADD_ : public _CvMAT_BASE_OP_
694 explicit _CvMAT_MUL_ADD_( const CvMAT* a, const CvMAT* b,
695 const CvMAT* c, int t_abc );
696 explicit _CvMAT_MUL_ADD_( const CvMAT* a, const CvMAT* b, double alpha,
697 const CvMAT* c, double beta, int t_abc );
698 operator CvMAT() const;
704 int t_abc; /* (t_abc & 1) = ta, (t_abc & 2) = tb, (t_abc & 4) = tc */
709 struct CV_EXPORTS _CvMAT_ADD_ : public _CvMAT_BASE_OP_
711 explicit _CvMAT_ADD_( const CvMAT* a, const CvMAT* b, double beta = 1 );
712 operator CvMAT() const;
714 double norm( int norm_type = CV_L2 ) const;
715 _CvMAT_DOT_OP_ abs() const;
723 /* A*alpha + B*beta + gamma */
724 struct CV_EXPORTS _CvMAT_ADD_EX_ : public _CvMAT_BASE_OP_
726 explicit _CvMAT_ADD_EX_( const CvMAT* a, double alpha,
727 const CvMAT* b, double beta, double gamma = 0 );
728 operator CvMAT() const;
730 double alpha, beta, gamma;
737 struct CV_EXPORTS _CvMAT_SCALE_ : public _CvMAT_BASE_OP_
739 explicit _CvMAT_SCALE_( const CvMAT* a, double alpha );
740 operator CvMAT() const;
742 _CvMAT_DOT_OP_ mul( const CvMAT& a ) const;
743 _CvMAT_DOT_OP_ mul( const _CvMAT_SCALE_& a ) const;
745 _CvMAT_DOT_OP_ div( const CvMAT& a ) const;
746 _CvMAT_DOT_OP_ div( const _CvMAT_SCALE_& a ) const;
754 struct CV_EXPORTS _CvMAT_SCALE_SHIFT_ : public _CvMAT_BASE_OP_
756 explicit _CvMAT_SCALE_SHIFT_( const CvMAT* a, double alpha, double beta );
757 operator CvMAT() const;
759 _CvMAT_DOT_OP_ abs() const;
766 /* (A & B), (A | B) or (A ^ B) */
767 struct CV_EXPORTS _CvMAT_LOGIC_ : public _CvMAT_BASE_OP_
769 enum Op { AND = 0, OR = 1, XOR = 2 };
770 explicit _CvMAT_LOGIC_( const CvMAT* a, const CvMAT* b, Op op, int flags = 0 );
771 operator CvMAT() const;
780 /* (A & scalar), (A | scalar) or (A ^ scalar) */
781 struct CV_EXPORTS _CvMAT_UN_LOGIC_ : public _CvMAT_BASE_OP_
783 explicit _CvMAT_UN_LOGIC_( const CvMAT* a, double alpha,
784 _CvMAT_LOGIC_::Op op, int flags = 0 );
785 operator CvMAT() const;
789 _CvMAT_LOGIC_::Op op;
795 struct CV_EXPORTS _CvMAT_NOT_ : public _CvMAT_BASE_OP_
797 explicit _CvMAT_NOT_( const CvMAT* a );
798 operator CvMAT() const;
804 /* conversion of data type */
805 struct CV_EXPORTS _CvMAT_CVT_ : public _CvMAT_BASE_OP_
807 explicit _CvMAT_CVT_( const CvMAT* a, int newdepth = -1,
808 double scale = 1, double shift = 0 );
809 operator CvMAT() const;
817 /* conversion of data type */
818 struct CV_EXPORTS _CvMAT_COPY_
820 explicit _CvMAT_COPY_( const CvMAT* a );
821 operator CvMAT() const;
826 /* a.op(b), where op = mul, div, min, max ... */
827 struct CV_EXPORTS _CvMAT_DOT_OP_ : public _CvMAT_BASE_OP_
829 explicit _CvMAT_DOT_OP_( const CvMAT* a, const CvMAT* b,
830 int op, double alpha = 1 );
831 operator CvMAT() const;
833 CvMAT a; /* keep the left operand copy */
840 /* A.inv()*B or A.pinv()*B */
841 struct CV_EXPORTS _CvMAT_SOLVE_ : public _CvMAT_BASE_OP_
843 explicit _CvMAT_SOLVE_( const CvMAT* a, const CvMAT* b, int method );
844 operator CvMAT() const;
853 struct CV_EXPORTS _CvMAT_CMP_ : public _CvMAT_BASE_OP_
855 explicit _CvMAT_CMP_( const CvMAT* a, const CvMAT* b, int cmp_op );
856 explicit _CvMAT_CMP_( const CvMAT* a, double alpha, int cmp_op );
857 operator CvMAT() const;
866 /************************* _CvMATConstElem_ inline methods ******************************/
868 inline _CvMATConstElem_::_CvMATConstElem_(const uchar* p, int t) : ptr((uchar*)p), type(t)
872 inline _CvMATConstElem_::operator CvScalar() const
875 cvRawDataToScalar( ptr, type, &scalar );
881 inline double _CvMATConstElem_::operator ()( int coi ) const
882 { return CvMAT::get( ptr, type, coi ); }
885 inline _CvMATElemCn_::_CvMATElemCn_( uchar* p, int t, int coi ) :
886 ptr(p), type(CV_MAT_DEPTH(t))
890 assert( (unsigned)coi < (unsigned)CV_MAT_CN(t) );
891 ptr += coi * CV_ELEM_SIZE(type);
896 inline _CvMATElemCn_::operator double() const
897 { return CvMAT::get( ptr, type ); }
900 inline _CvMATElemCn_& _CvMATElemCn_::operator = ( const _CvMATConstElem_& elem )
902 if( type == elem.type )
903 memcpy( ptr, elem.ptr, CV_ELEM_SIZE(type) );
906 assert( CV_MAT_CN(elem.type) == 1 );
907 CvMAT::set( ptr, type, 0, elem(0));
914 inline _CvMATElemCn_& _CvMATElemCn_::operator = ( const _CvMATElemCn_& elem )
916 if( type == elem.type )
917 memcpy( ptr, elem.ptr, CV_ELEM_SIZE(type) );
919 CvMAT::set( ptr, type, 0, (double)elem );
924 inline _CvMATElemCn_& _CvMATElemCn_::operator = ( const CvScalar& scalar )
926 CvMAT::set( ptr, type, 0, scalar.val[0] );
931 inline _CvMATElemCn_& _CvMATElemCn_::operator = ( double d )
933 CvMAT::set( ptr, type, 0, d );
938 inline _CvMATElemCn_& _CvMATElemCn_::operator = ( float f )
940 CvMAT::set( ptr, type, 0, (double)f );
945 inline _CvMATElemCn_& _CvMATElemCn_::operator = ( int i )
947 CvMAT::set( ptr, type, 0, i );
952 inline _CvMATElem_::_CvMATElem_( uchar* p, int t ) : _CvMATConstElem_( (const uchar*)p, t )
956 inline _CvMATElemCn_ _CvMATElem_::operator ()( int coi )
957 { return _CvMATElemCn_( ptr, type, coi ); }
960 inline _CvMATElem_& _CvMATElem_::operator = ( const _CvMATConstElem_& elem )
962 if( type == elem.type )
963 memcpy( ptr, elem.ptr, CV_ELEM_SIZE(type) );
966 assert( CV_MAT_CN( type ^ elem.type ) == 0 );
967 CvScalar sc = (CvScalar)elem;
968 cvScalarToRawData( &sc, ptr, type, 0 );
975 inline _CvMATElem_& _CvMATElem_::operator = ( const _CvMATElem_& elem )
977 *this = (const _CvMATConstElem_&)elem;
982 inline _CvMATElem_& _CvMATElem_::operator = ( const _CvMATElemCn_& elem )
984 if( type == elem.type )
985 memcpy( ptr, elem.ptr, CV_ELEM_SIZE(type) );
987 CvMAT::set( ptr, type, (double)elem );
993 inline _CvMATElem_& _CvMATElem_::operator = ( const CvScalar& scalar )
995 cvScalarToRawData( &scalar, ptr, type, 0 );
1000 inline _CvMATElem_& _CvMATElem_::operator = ( double d )
1002 CvMAT::set( ptr, type, d );
1007 inline _CvMATElem_& _CvMATElem_::operator = ( float f )
1009 CvMAT::set( ptr, type, (double)f );
1014 inline _CvMATElem_& _CvMATElem_::operator = ( int i )
1016 CvMAT::set( ptr, type, i );
1021 /********************************** CvMAT inline methods ********************************/
1023 inline CvMAT::CvMAT()
1025 memset( this, 0, sizeof(*this));
1029 inline CvMAT::CvMAT( int rows, int cols, int type, void* data, int step )
1031 cvInitMatHeader( this, rows, cols, type, data, step );
1035 inline CvMAT::CvMAT( int rows, int type, void* data, int step )
1037 cvInitMatHeader( this, rows, 1, type, data, step );
1041 inline void CvMAT::create( int rows, int cols, int type )
1043 int step = cols*CV_ELEM_SIZE(type), total_size = step*rows;
1046 this->step = rows == 1 ? 0 : step;
1047 this->type = CV_MAT_MAGIC_VAL | (type & CV_MAT_TYPE_MASK) | CV_MAT_CONT_FLAG;
1048 refcount = (int*)cvAlloc((size_t)total_size + 8);
1049 data.ptr = (uchar*)(((size_t)(refcount + 1) + 7) & -8);
1054 inline CvMAT::CvMAT( int rows, int cols, int type )
1056 create( rows, cols, type );
1060 inline CvMAT::CvMAT( int rows, int type )
1062 create( rows, 1, type );
1066 inline CvMAT::CvMAT( const CvMat& mat )
1068 memcpy( this, &mat, sizeof(mat));
1074 inline CvMAT::CvMAT( const CvMAT& mat )
1076 memcpy( this, &mat, sizeof(mat));
1082 inline CvMAT::CvMAT( const IplImage& img )
1084 cvGetMat( &img, this );
1088 inline void CvMAT::release()
1091 if( refcount != NULL && --*refcount == 0 )
1092 cvFree( (void**)&refcount );
1097 inline CvMAT::~CvMAT()
1103 inline CvMAT& CvMAT::operator = ( const CvMAT& mat )
1108 memcpy( this, &mat, sizeof(mat));
1116 inline CvMAT& CvMAT::operator = ( const CvMat& mat )
1118 *this = (const CvMAT&)mat;
1123 inline CvMAT& CvMAT::operator = ( const IplImage& img )
1126 cvGetMat( &img, this );
1132 inline CvMAT& CvMAT::operator = ( double fillval )
1134 cvFillImage( this, fillval );
1139 inline CvMAT& CvMAT::operator = ( const CvScalar& fillval )
1141 cvSet( this, fillval );
1146 inline CvMAT& CvMAT::operator += ( const CvMat& mat )
1148 cvAdd( this, &mat, this );
1153 inline CvMAT& CvMAT::operator += ( double val )
1155 cvAddS( this, cvScalar(val), this );
1160 inline CvMAT& CvMAT::operator += ( const CvScalar& val )
1162 cvAddS( this, val, this );
1167 inline CvMAT& CvMAT::operator -= ( const CvMat& mat )
1169 cvSub( this, &mat, this );
1174 inline CvMAT& CvMAT::operator -= ( double val )
1176 cvSubS( this, cvScalar(val), this );
1181 inline CvMAT& CvMAT::operator -= ( const CvScalar& val )
1183 cvSubS( this, val, this );
1188 inline CvMAT& CvMAT::operator *= ( const CvMat& mat )
1190 cvMul( this, &mat, this );
1195 inline CvMAT& CvMAT::operator *= ( double val )
1197 cvScale( this, this, val, 0 );
1202 inline CvMAT& CvMAT::operator *= ( const CvScalar& val )
1204 cvScaleAdd( this, val, 0, this );
1209 inline CvMAT& CvMAT::operator &= ( const CvMat& mat )
1211 cvAnd( this, &mat, this );
1216 inline CvMAT& CvMAT::operator &= ( double val )
1218 cvAndS( this, cvScalarAll(val), this );
1223 inline CvMAT& CvMAT::operator &= ( const CvScalar& val )
1225 cvAndS( this, val, this );
1230 inline CvMAT& CvMAT::operator |= ( const CvMat& mat )
1232 cvOr( this, &mat, this );
1237 inline CvMAT& CvMAT::operator |= ( double val )
1239 cvOrS( this, cvScalarAll(val), this );
1244 inline CvMAT& CvMAT::operator |= ( const CvScalar& val )
1246 cvOrS( this, val, this );
1251 inline CvMAT& CvMAT::operator ^= ( const CvMat& mat )
1253 cvXor( this, &mat, this );
1258 inline CvMAT& CvMAT::operator ^= ( double val )
1260 cvXorS( this, cvScalarAll(val), this );
1265 inline CvMAT& CvMAT::operator ^= ( const CvScalar& val )
1267 cvXorS( this, val, this );
1272 inline double CvMAT::norm( int normType ) const
1273 { return cvNorm( this, 0, normType ); }
1276 inline double CvMAT::min( CvPoint* minloc ) const
1279 cvMinMaxLoc( this, &t, 0, minloc, 0, 0 );
1283 inline double CvMAT::max( CvPoint* maxloc ) const
1286 cvMinMaxLoc( this, 0, &t, 0, maxloc, 0 );
1291 inline double CvMAT::norm( CvMat& mat, int normType ) const
1292 { return cvNorm( this, &mat, normType ); }
1295 inline CvScalar CvMAT::sum() const
1296 { return cvSum( this ); }
1299 inline double CvMAT::det() const
1300 { return cvDet( this ); }
1303 inline void CvMAT::reshape( int newcn, int newrows )
1304 { cvReshape( this, this, newcn, newrows ); }
1307 inline void CvMAT::flipX()
1308 { cvFlip( this, this, 1 ); }
1311 inline void CvMAT::flipY()
1312 { cvFlip( this, this, 0 ); }
1315 inline void CvMAT::flipXY()
1316 { cvFlip( this, this, -1 ); }
1319 inline _CvMATElem_ CvMAT::operator ()( int row )
1320 { return _CvMATElem_( CV_MAT_ELEM_PTR( *this, row, 0 ), type ); }
1323 inline _CvMATConstElem_ CvMAT::operator ()( int row ) const
1324 { return _CvMATConstElem_( CV_MAT_ELEM_PTR( *this, row, 0 ), type ); }
1327 inline _CvMATElem_ CvMAT::operator ()( int row, int col )
1328 { return _CvMATElem_( CV_MAT_ELEM_PTR( *this, row, col ), type ); }
1331 inline _CvMATConstElem_ CvMAT::operator ()( int row, int col ) const
1332 { return _CvMATConstElem_( CV_MAT_ELEM_PTR( *this, row, col ), type ); }
1335 inline _CvMATElemCn_ CvMAT::operator()( int row, int col, int coi )
1336 { return _CvMATElemCn_( CV_MAT_ELEM_PTR( *this, row, col ), type, coi ); }
1339 inline _CvMATElemCn_ CvMAT::operator()( CvPoint pt, int coi )
1340 { return _CvMATElemCn_( CV_MAT_ELEM_PTR( *this, pt.y, pt.x ), type, coi ); }
1343 inline double CvMAT::operator()( int row, int col, int coi ) const
1344 { return get( CV_MAT_ELEM_PTR( *this, row, col ), type, coi ); }
1347 inline _CvMATElem_ CvMAT::operator ()( CvPoint pt )
1348 { return _CvMATElem_( CV_MAT_ELEM_PTR( *this, pt.y, pt.x ), type ); }
1351 inline _CvMATConstElem_ CvMAT::operator ()( CvPoint pt ) const
1352 { return _CvMATConstElem_( CV_MAT_ELEM_PTR( *this, pt.y, pt.x ), type ); }
1355 inline double CvMAT::operator()( CvPoint pt, int coi ) const
1356 { return get( CV_MAT_ELEM_PTR( *this, pt.y, pt.x ), type, coi ); }
1359 inline void* CvMAT::ptr( int row )
1360 { return CV_MAT_ELEM_PTR( *this, row, 0 ); }
1363 inline const void* CvMAT::ptr( int row ) const
1364 { return (const void*)CV_MAT_ELEM_PTR( *this, row, 0 ); }
1367 inline void* CvMAT::ptr( int row, int col )
1368 { return CV_MAT_ELEM_PTR( *this, row, col ); }
1371 inline const void* CvMAT::ptr( int row, int col ) const
1372 { return (const void*)CV_MAT_ELEM_PTR( *this, row, col ); }
1375 inline void* CvMAT::ptr( CvPoint pt )
1376 { return CV_MAT_ELEM_PTR( *this, pt.y, pt.x ); }
1379 inline const void* CvMAT::ptr( CvPoint pt ) const
1380 { return (const void*)CV_MAT_ELEM_PTR( *this, pt.y, pt.x ); }
1383 inline _CvMAT_INV_ CvMAT::inv( int method ) const
1384 { return _CvMAT_INV_( this, method ); }
1387 inline _CvMAT_T_ CvMAT::t() const
1388 { return _CvMAT_T_( this ); }
1391 inline _CvMAT_COPY_ CvMAT::clone() const
1392 { return _CvMAT_COPY_( this ); }
1394 inline _CvMAT_CVT_ CvMAT::cvt( int newdepth, double scale, double shift ) const
1395 { return _CvMAT_CVT_( this, newdepth, scale, shift ); }
1398 inline CvMAT::CvMAT( const CvMat& mat, CvRect rect )
1401 cvGetSubArr( &mat, this, rect );
1402 cvIncRefData( this );
1409 k < 0 - i-th diagonal */
1410 inline CvMAT::CvMAT( const CvMat& mat, int k, int i )
1414 cvGetRow( &mat, this, i );
1416 cvGetCol( &mat, this, i );
1418 cvGetDiag( &mat, this, i );
1419 cvIncRefData( this );
1423 inline CvMAT CvMAT::row( int r ) const
1424 { return CvMAT( *this, 0, r ); }
1427 inline CvMAT CvMAT::col( int c ) const
1428 { return CvMAT( *this, 1, c ); }
1431 inline CvMAT CvMAT::diag( int d ) const
1432 { return CvMAT( *this, -1, d ); }
1435 inline CvMAT CvMAT::rect( CvRect rect ) const
1436 { return CvMAT( *this, rect ); }
1438 inline CvMAT CvMAT::rowrange( int row1, int row2 ) const
1440 assert( 0 <= row1 && row1 < row2 && row2 <= height );
1441 return CvMAT( *this, cvRect( 0, row1, width, row2 - row1 ));
1444 inline CvMAT CvMAT::colrange( int col1, int col2 ) const
1446 assert( 0 <= col1 && col1 < col2 && col2 <= width );
1447 return CvMAT( *this, cvRect( col1, 0, col2 - col1, height ));
1450 inline _CvMAT_DOT_OP_ CvMAT::mul( const CvMAT& mat ) const
1451 { return _CvMAT_DOT_OP_( this, &mat, '*' ); }
1453 inline _CvMAT_DOT_OP_ CvMAT::mul( const _CvMAT_SCALE_& mat ) const
1454 { return _CvMAT_DOT_OP_( this, mat.a, '*', mat.alpha ); }
1456 inline _CvMAT_DOT_OP_ CvMAT::div( const CvMAT& mat ) const
1457 { return _CvMAT_DOT_OP_( this, &mat, '/' ); }
1459 inline _CvMAT_DOT_OP_ CvMAT::div( const _CvMAT_SCALE_& mat ) const
1460 { return _CvMAT_DOT_OP_( this, mat.a, '/', 1./mat.alpha ); }
1462 inline _CvMAT_DOT_OP_ CvMAT::min( const CvMAT& mat ) const
1463 { return _CvMAT_DOT_OP_( this, &mat, 'm' ); }
1465 inline _CvMAT_DOT_OP_ CvMAT::max( const CvMAT& mat ) const
1466 { return _CvMAT_DOT_OP_( this, &mat, 'M' ); }
1468 inline _CvMAT_DOT_OP_ CvMAT::min( double value ) const
1469 { return _CvMAT_DOT_OP_( this, 0, 'm', value ); }
1471 inline _CvMAT_DOT_OP_ CvMAT::max( double value ) const
1472 { return _CvMAT_DOT_OP_( this, 0, 'M', value ); }
1474 inline _CvMAT_DOT_OP_ CvMAT::abs() const
1475 { return _CvMAT_DOT_OP_( this, 0, 'a', 0 ); }
1477 /****************************************************************************************\
1478 * binary operations (+,-,*) *
1479 \****************************************************************************************/
1482 * PART I. Scaling, shifting, addition/subtraction operations
1485 /* (mat2^t) = (mat1^t) * scalar */
1486 inline _CvMAT_T_ operator * ( const _CvMAT_T_& a, double alpha )
1487 { return _CvMAT_T_( &a.a, a.alpha*alpha ); }
1489 /* (mat2^t) = scalar * (mat1^t) */
1490 inline _CvMAT_T_ operator * ( double alpha, const _CvMAT_T_& a )
1491 { return _CvMAT_T_( &a.a, a.alpha*alpha ); }
1494 inline _CvMAT_T_ operator - ( const _CvMAT_T_& a )
1495 { return _CvMAT_T_( &a.a, -a.alpha ); }
1497 /* mat_scaled = mat * scalar */
1498 inline _CvMAT_SCALE_ operator * ( const CvMAT& a, double alpha )
1499 { return _CvMAT_SCALE_( &a, alpha ); }
1501 /* mat_scaled = scalar * mat */
1502 inline _CvMAT_SCALE_ operator * ( double alpha, const CvMAT& a )
1503 { return _CvMAT_SCALE_( &a, alpha ); }
1505 /* mat_scaled2 = mat_scaled1 * scalar */
1506 inline _CvMAT_SCALE_ operator * ( const _CvMAT_SCALE_& a, double alpha )
1507 { return _CvMAT_SCALE_( a.a, a.alpha*alpha ); }
1509 /* mat_scaled2 = scalar * mat_scaled1 */
1510 inline _CvMAT_SCALE_ operator * ( double alpha, const _CvMAT_SCALE_& a )
1511 { return _CvMAT_SCALE_( a.a, a.alpha*alpha ); }
1514 inline _CvMAT_SCALE_ operator - ( const _CvMAT_SCALE_& a )
1515 { return _CvMAT_SCALE_( a.a, -a.alpha ); }
1518 /* mat_scaled_shifted = mat + scalar */
1519 inline _CvMAT_SCALE_SHIFT_ operator + ( const CvMAT& a, double beta )
1520 { return _CvMAT_SCALE_SHIFT_( &a, 1, beta ); }
1522 /* mat_scaled_shifted = scalar + mat */
1523 inline _CvMAT_SCALE_SHIFT_ operator + ( double beta, const CvMAT& a )
1524 { return _CvMAT_SCALE_SHIFT_( &a, 1, beta ); }
1526 /* mat_scaled_shifted = mat - scalar */
1527 inline _CvMAT_SCALE_SHIFT_ operator - ( const CvMAT& a, double beta )
1528 { return _CvMAT_SCALE_SHIFT_( &a, 1, -beta ); }
1530 /* mat_scaled_shifted = scalar - mat */
1531 inline _CvMAT_SCALE_SHIFT_ operator - ( double beta, const CvMAT& a )
1532 { return _CvMAT_SCALE_SHIFT_( &a, -1, beta ); }
1534 /* mat_scaled_shifted = mat_scaled + scalar */
1535 inline _CvMAT_SCALE_SHIFT_ operator + ( const _CvMAT_SCALE_& a, double beta )
1536 { return _CvMAT_SCALE_SHIFT_( a.a, a.alpha, beta ); }
1538 /* mat_scaled_shifted = scalar + mat_scaled */
1539 inline _CvMAT_SCALE_SHIFT_ operator + ( double beta, const _CvMAT_SCALE_& a )
1540 { return _CvMAT_SCALE_SHIFT_( a.a, a.alpha, beta ); }
1542 /* mat_scaled_shifted = mat_scaled - scalar */
1543 inline _CvMAT_SCALE_SHIFT_ operator - ( const _CvMAT_SCALE_& a, double beta )
1544 { return _CvMAT_SCALE_SHIFT_( a.a, a.alpha, -beta ); }
1546 /* mat_scaled_shifted = scalar - mat_scaled */
1547 inline _CvMAT_SCALE_SHIFT_ operator - ( double beta, const _CvMAT_SCALE_& a )
1548 { return _CvMAT_SCALE_SHIFT_( a.a, -a.alpha, beta ); }
1550 /* mat_scaled_shifted2 = mat_scaled_shifted1 + scalar */
1551 inline _CvMAT_SCALE_SHIFT_ operator + ( const _CvMAT_SCALE_SHIFT_& a, double beta )
1552 { return _CvMAT_SCALE_SHIFT_( a.a, a.alpha, a.beta + beta ); }
1554 /* mat_scaled_shifted2 = scalar + mat_scaled_shifted1 */
1555 inline _CvMAT_SCALE_SHIFT_ operator + ( double beta, const _CvMAT_SCALE_SHIFT_& a )
1556 { return _CvMAT_SCALE_SHIFT_( a.a, a.alpha, a.beta + beta ); }
1558 /* mat_scaled_shifted2 = mat_scaled_shifted1 - scalar */
1559 inline _CvMAT_SCALE_SHIFT_ operator - ( const _CvMAT_SCALE_SHIFT_& a, double beta )
1560 { return _CvMAT_SCALE_SHIFT_( a.a, a.alpha, a.beta - beta ); }
1562 /* mat_scaled_shifted2 = scalar - mat_scaled_shifted1 */
1563 inline _CvMAT_SCALE_SHIFT_ operator - ( double beta, const _CvMAT_SCALE_SHIFT_& a )
1564 { return _CvMAT_SCALE_SHIFT_( a.a, -a.alpha, beta - a.beta ); }
1566 /* mat_scaled_shifted2 = mat_scaled_shifted1 * scalar */
1567 inline _CvMAT_SCALE_SHIFT_ operator * ( const _CvMAT_SCALE_SHIFT_& a, double alpha )
1568 { return _CvMAT_SCALE_SHIFT_( a.a, a.alpha*alpha, a.beta*alpha ); }
1570 /* mat_scaled_shifted2 = scalar * mat_scaled_shifted1 */
1571 inline _CvMAT_SCALE_SHIFT_ operator * ( double alpha, const _CvMAT_SCALE_SHIFT_& a )
1572 { return _CvMAT_SCALE_SHIFT_( a.a, a.alpha*alpha, a.beta*alpha ); }
1574 /* -mat_scaled_shifted */
1575 inline _CvMAT_SCALE_SHIFT_ operator - ( const _CvMAT_SCALE_SHIFT_& a )
1576 { return _CvMAT_SCALE_SHIFT_( a.a, -a.alpha, -a.beta ); }
1580 inline _CvMAT_SCALE_ operator - ( const CvMAT& a )
1581 { return _CvMAT_SCALE_( &a, -1 ); }
1583 /* mat_add = mat1 + mat2 */
1584 inline _CvMAT_ADD_ operator + ( const CvMAT& a, const CvMAT& b )
1585 { return _CvMAT_ADD_( &a, &b ); }
1587 /* mat_add = mat1 - mat2 */
1588 inline _CvMAT_ADD_ operator - ( const CvMAT& a, const CvMAT& b )
1589 { return _CvMAT_ADD_( &a, &b, -1 ); }
1591 /* mat_add = mat_scaled1 + mat2 */
1592 inline _CvMAT_ADD_ operator + ( const _CvMAT_SCALE_& a, const CvMAT& b )
1593 { return _CvMAT_ADD_( &b, a.a, a.alpha ); }
1595 /* mat_add = mat1 + mat_scaled2 */
1596 inline _CvMAT_ADD_ operator + ( const CvMAT& b, const _CvMAT_SCALE_& a )
1597 { return _CvMAT_ADD_( &b, a.a, a.alpha ); }
1600 inline _CvMAT_ADD_EX_ operator - ( const _CvMAT_ADD_& a )
1601 { return _CvMAT_ADD_EX_( a.a, -1, a.b, -a.beta ); }
1603 /* mat_add = mat_scaled1 - mat2 */
1604 inline _CvMAT_ADD_EX_ operator - ( const _CvMAT_SCALE_& a, const CvMAT& b )
1605 { return _CvMAT_ADD_EX_( a.a, a.alpha, &b, -1 ); }
1607 /* mat_add = mat1 - mat_scaled2 */
1608 inline _CvMAT_ADD_ operator - ( const CvMAT& b, const _CvMAT_SCALE_& a )
1609 { return _CvMAT_ADD_( &b, a.a, -a.alpha ); }
1611 /* mat_add = mat_scaled_shifted1 + mat2 */
1612 inline _CvMAT_ADD_EX_ operator + ( const _CvMAT_SCALE_SHIFT_& a, const CvMAT& b )
1613 { return _CvMAT_ADD_EX_( a.a, a.alpha, &b, 1, a.beta ); }
1615 /* mat_add = mat1 + mat_scaled_shifted2 */
1616 inline _CvMAT_ADD_EX_ operator + ( const CvMAT& b, const _CvMAT_SCALE_SHIFT_& a )
1617 { return _CvMAT_ADD_EX_( a.a, a.alpha, &b, 1, a.beta ); }
1619 /* mat_add = mat_scaled_shifted1 - mat2 */
1620 inline _CvMAT_ADD_EX_ operator - ( const _CvMAT_SCALE_SHIFT_& a, const CvMAT& b )
1621 { return _CvMAT_ADD_EX_( a.a, a.alpha, &b, -1, a.beta ); }
1623 /* mat_add = mat1 - mat_scaled_shifted2 */
1624 inline _CvMAT_ADD_EX_ operator - ( const CvMAT& b, const _CvMAT_SCALE_SHIFT_& a )
1625 { return _CvMAT_ADD_EX_( a.a, -a.alpha, &b, 1, -a.beta ); }
1627 /* mat_add = mat_scaled_shifted1 + mat_scaled2 */
1628 inline _CvMAT_ADD_EX_ operator + ( const _CvMAT_SCALE_SHIFT_& a, const _CvMAT_SCALE_& b )
1629 { return _CvMAT_ADD_EX_( a.a, a.alpha, b.a, b.alpha, a.beta ); }
1631 /* mat_add = mat_scaled1 + mat_scaled_shifted2 */
1632 inline _CvMAT_ADD_EX_ operator + ( const _CvMAT_SCALE_& b, const _CvMAT_SCALE_SHIFT_& a )
1633 { return _CvMAT_ADD_EX_( a.a, a.alpha, b.a, b.alpha, a.beta ); }
1635 /* mat_add = mat_scaled_shifted1 - mat_scaled2 */
1636 inline _CvMAT_ADD_EX_ operator - ( const _CvMAT_SCALE_SHIFT_& a, const _CvMAT_SCALE_& b )
1637 { return _CvMAT_ADD_EX_( a.a, a.alpha, b.a, -b.alpha, a.beta ); }
1639 /* mat_add = mat_scaled1 - mat_scaled_shifted2 */
1640 inline _CvMAT_ADD_EX_ operator - ( const _CvMAT_SCALE_& b, const _CvMAT_SCALE_SHIFT_& a )
1641 { return _CvMAT_ADD_EX_( a.a, -a.alpha, b.a, b.alpha, -a.beta ); }
1643 /* mat_add = mat_scaled1 + mat_scaled2 */
1644 inline _CvMAT_ADD_EX_ operator + ( const _CvMAT_SCALE_& a, const _CvMAT_SCALE_& b )
1645 { return _CvMAT_ADD_EX_( a.a, a.alpha, b.a, b.alpha ); }
1647 /* mat_add = mat_scaled1 - mat_scaled2 */
1648 inline _CvMAT_ADD_EX_ operator - ( const _CvMAT_SCALE_& a, const _CvMAT_SCALE_& b )
1649 { return _CvMAT_ADD_EX_( a.a, a.alpha, b.a, -b.alpha ); }
1651 /* mat_add = mat_scaled_shifted1 + mat_scaled_shifted2 */
1652 inline _CvMAT_ADD_EX_ operator + ( const _CvMAT_SCALE_SHIFT_& a,
1653 const _CvMAT_SCALE_SHIFT_& b )
1654 { return _CvMAT_ADD_EX_( a.a, a.alpha, b.a, b.alpha, a.beta + b.beta ); }
1656 /* mat_add = mat_scaled_shifted1 - mat_scaled_shifted2 */
1657 inline _CvMAT_ADD_EX_ operator - ( const _CvMAT_SCALE_SHIFT_& a,
1658 const _CvMAT_SCALE_SHIFT_& b )
1659 { return _CvMAT_ADD_EX_( a.a, a.alpha, b.a, -b.alpha, a.beta - b.beta ); }
1661 /* mat_add2 = mat_add1 + scalar */
1662 inline _CvMAT_ADD_EX_ operator + ( const _CvMAT_ADD_EX_& a, double gamma )
1663 { return _CvMAT_ADD_EX_( a.a, a.alpha, a.b, a.beta, a.gamma + gamma ); }
1665 /* mat_add2 = scalar + mat_add1 */
1666 inline _CvMAT_ADD_EX_ operator + ( double gamma, const _CvMAT_ADD_EX_& a )
1667 { return _CvMAT_ADD_EX_( a.a, a.alpha, a.b, a.beta, a.gamma + gamma ); }
1669 /* mat_add2 = mat_add1 - scalar */
1670 inline _CvMAT_ADD_EX_ operator - ( const _CvMAT_ADD_EX_& a, double gamma )
1671 { return _CvMAT_ADD_EX_( a.a, a.alpha, a.b, a.beta, a.gamma - gamma ); }
1673 /* mat_add2 = scalar - mat_add1 */
1674 inline _CvMAT_ADD_EX_ operator - ( double gamma, const _CvMAT_ADD_EX_& a )
1675 { return _CvMAT_ADD_EX_( a.a, -a.alpha, a.b, -a.beta, gamma - a.gamma ); }
1677 /* mat_add2 = mat_add1 * scalar */
1678 inline _CvMAT_ADD_EX_ operator * ( const _CvMAT_ADD_EX_& a, double alpha )
1679 { return _CvMAT_ADD_EX_( a.a, a.alpha*alpha, a.b, a.beta*alpha, a.gamma*alpha ); }
1681 /* mat_add2 = scalar * mat_add1 */
1682 inline _CvMAT_ADD_EX_ operator * ( double alpha, const _CvMAT_ADD_EX_& a )
1683 { return _CvMAT_ADD_EX_( a.a, a.alpha*alpha, a.b, a.beta*alpha, a.gamma*alpha ); }
1685 /* mat_add2 = mat_add1 + scalar */
1686 inline _CvMAT_ADD_EX_ operator + ( const _CvMAT_ADD_& a, double gamma )
1687 { return _CvMAT_ADD_EX_( a.a, 1, a.b, a.beta, gamma ); }
1689 /* mat_add2 = scalar + mat_add1 */
1690 inline _CvMAT_ADD_EX_ operator + ( double gamma, const _CvMAT_ADD_& a )
1691 { return _CvMAT_ADD_EX_( a.a, 1, a.b, a.beta, gamma ); }
1693 /* mat_add2 = mat_add1 - scalar */
1694 inline _CvMAT_ADD_EX_ operator - ( const _CvMAT_ADD_& a, double gamma )
1695 { return _CvMAT_ADD_EX_( a.a, 1, a.b, a.beta, -gamma ); }
1697 /* mat_add2 = scalar - mat_add1 */
1698 inline _CvMAT_ADD_EX_ operator - ( double gamma, const _CvMAT_ADD_& a )
1699 { return _CvMAT_ADD_EX_( a.a, -1, a.b, -a.beta, gamma ); }
1701 /* mat_add2 = mat_add1 * scalar */
1702 inline _CvMAT_ADD_EX_ operator * ( const _CvMAT_ADD_& a, double alpha )
1703 { return _CvMAT_ADD_EX_( a.a, alpha, a.b, a.beta*alpha, 0 ); }
1705 /* mat_add2 = scalar * mat_add1 */
1706 inline _CvMAT_ADD_EX_ operator * ( double alpha, const _CvMAT_ADD_& a )
1707 { return _CvMAT_ADD_EX_( a.a, alpha, a.b, a.beta*alpha, 0 ); }
1710 inline _CvMAT_ADD_EX_ operator - ( const _CvMAT_ADD_EX_& a )
1711 { return _CvMAT_ADD_EX_( a.a, -a.alpha, a.b, -a.beta, -a.gamma ); }
1715 * PART II. Matrix multiplication.
1718 /* mmul = mat1 * mat2 */
1719 inline _CvMAT_MUL_ operator * ( const CvMAT& a, const CvMAT& b )
1720 { return _CvMAT_MUL_( &a, &b, 0 ); }
1722 /* mmul = (mat1^t) * mat2 */
1723 inline _CvMAT_MUL_ operator * ( const _CvMAT_T_& a, const CvMAT& b )
1724 { return _CvMAT_MUL_( &a.a, &b, a.alpha, 1 ); }
1726 /* mmul = mat1 * (mat2^t) */
1727 inline _CvMAT_MUL_ operator * ( const CvMAT& b, const _CvMAT_T_& a )
1728 { return _CvMAT_MUL_( &b, &a.a, a.alpha, 2 ); }
1730 /* mmul = (mat1^t) * (mat2^t) */
1731 inline _CvMAT_MUL_ operator * ( const _CvMAT_T_& a, const _CvMAT_T_& b )
1732 { return _CvMAT_MUL_( &a.a, &b.a, a.alpha*b.alpha, 3 ); }
1734 /* mmul = mat_scaled1 * mat2 */
1735 inline _CvMAT_MUL_ operator * ( const _CvMAT_SCALE_& a, const CvMAT& b )
1736 { return _CvMAT_MUL_( a.a, &b, a.alpha, 0 ); }
1738 /* mmul = mat1 * mat_scaled2 */
1739 inline _CvMAT_MUL_ operator * ( const CvMAT& b, const _CvMAT_SCALE_& a )
1740 { return _CvMAT_MUL_( &b, a.a, a.alpha, 0 ); }
1742 /* mmul = (mat1^t) * mat_scaled1 */
1743 inline _CvMAT_MUL_ operator * ( const _CvMAT_T_& a, const _CvMAT_SCALE_& b )
1744 { return _CvMAT_MUL_( &a.a, b.a, a.alpha*b.alpha, 1 ); }
1746 /* mmul = mat_scaled1 * (mat2^t) */
1747 inline _CvMAT_MUL_ operator * ( const _CvMAT_SCALE_& b, const _CvMAT_T_& a )
1748 { return _CvMAT_MUL_( b.a, &a.a, a.alpha*b.alpha, 2 ); }
1750 /* mmul = mat_scaled1 * mat_scaled2 */
1751 inline _CvMAT_MUL_ operator * ( const _CvMAT_SCALE_& a, const _CvMAT_SCALE_& b )
1752 { return _CvMAT_MUL_( a.a, b.a, a.alpha*b.alpha, 0 ); }
1754 /* mmul2 = mmul1 * scalar */
1755 inline _CvMAT_MUL_ operator * ( const _CvMAT_MUL_& a, double alpha )
1756 { return _CvMAT_MUL_( a.a, a.b, a.alpha*alpha, a.t_ab ); }
1758 /* mmul2 = scalar * mmul1 */
1759 inline _CvMAT_MUL_ operator * ( double alpha, const _CvMAT_MUL_& a )
1760 { return _CvMAT_MUL_( a.a, a.b, a.alpha*alpha, a.t_ab ); }
1763 inline _CvMAT_MUL_ operator - ( const _CvMAT_MUL_& a )
1764 { return _CvMAT_MUL_( a.a, a.b, -a.alpha, a.t_ab ); }
1766 /* mmuladd = mmul + mat */
1767 inline _CvMAT_MUL_ADD_ operator + ( const _CvMAT_MUL_& a, const CvMAT& b )
1768 { return _CvMAT_MUL_ADD_( a.a, a.b, a.alpha, &b, 1, a.t_ab ); }
1770 /* !!! Comment this off because of ambigous conversion error !!!
1771 mmuladd = mat + mmul */
1772 /* inline _CvMAT_MUL_ADD_ operator + ( const CvMAT& b, const _CvMAT_MUL_& a )
1773 { return _CvMAT_MUL_ADD_( a.a, a.b, a.alpha, &b, 1, a.t_ab ); }*/
1775 /* mmuladd = mmul - mat */
1776 inline _CvMAT_MUL_ADD_ operator - ( const _CvMAT_MUL_& a, const CvMAT& b )
1777 { return _CvMAT_MUL_ADD_( a.a, a.b, a.alpha, &b, -1, a.t_ab ); }
1779 /* !!! Comment this off because of ambigous conversion error !!!
1780 mmuladd = mat - mmul */
1781 /*inline _CvMAT_MUL_ADD_ operator - ( const CvMAT& b, const _CvMAT_MUL_& a )
1782 { return _CvMAT_MUL_ADD_( a.a, a.b, -a.alpha, &b, 1, a.t_ab ); }*/
1784 /* mmuladd = mmul + mat_scaled */
1785 inline _CvMAT_MUL_ADD_ operator + ( const _CvMAT_MUL_& a, const _CvMAT_SCALE_& b )
1786 { return _CvMAT_MUL_ADD_( a.a, a.b, a.alpha, b.a, b.alpha, a.t_ab ); }
1788 /* mmuladd = mat_scaled + mmul */
1789 inline _CvMAT_MUL_ADD_ operator + ( const _CvMAT_SCALE_& b, const _CvMAT_MUL_& a )
1790 { return _CvMAT_MUL_ADD_( a.a, a.b, a.alpha, b.a, b.alpha, a.t_ab ); }
1792 /* mmuladd = mmul - mat_scaled */
1793 inline _CvMAT_MUL_ADD_ operator - ( const _CvMAT_MUL_& a, const _CvMAT_SCALE_& b )
1794 { return _CvMAT_MUL_ADD_( a.a, a.b, a.alpha, b.a, -b.alpha, a.t_ab ); }
1796 /* mmuladd = mat_scaled - mmul */
1797 inline _CvMAT_MUL_ADD_ operator - ( const _CvMAT_SCALE_& b, const _CvMAT_MUL_& a )
1798 { return _CvMAT_MUL_ADD_( a.a, a.b, -a.alpha, b.a, b.alpha, a.t_ab ); }
1800 /* mmuladd = mmul + (mat^t) */
1801 inline _CvMAT_MUL_ADD_ operator + ( const _CvMAT_MUL_& a, const _CvMAT_T_& b )
1802 { return _CvMAT_MUL_ADD_( a.a, a.b, a.alpha, &b.a, b.alpha, a.t_ab + 4 ); }
1804 /* mmuladd = (mat^t) + mmul */
1805 inline _CvMAT_MUL_ADD_ operator + ( const _CvMAT_T_& b, const _CvMAT_MUL_& a )
1806 { return _CvMAT_MUL_ADD_( a.a, a.b, a.alpha, &b.a, b.alpha, a.t_ab + 4 ); }
1808 /* mmuladd = mmul - (mat^t) */
1809 inline _CvMAT_MUL_ADD_ operator - ( const _CvMAT_MUL_& a, const _CvMAT_T_& b )
1810 { return _CvMAT_MUL_ADD_( a.a, a.b, a.alpha, &b.a, -b.alpha, a.t_ab + 4 ); }
1812 /* mmuladd = (mat^t) - mmul */
1813 inline _CvMAT_MUL_ADD_ operator - ( const _CvMAT_T_& b, const _CvMAT_MUL_& a )
1814 { return _CvMAT_MUL_ADD_( a.a, a.b, -a.alpha, &b.a, b.alpha, a.t_ab + 4 ); }
1817 /* mmuladd = mat_scaled_shifted * mat */
1818 inline _CvMAT_MUL_ADD_ operator * ( const _CvMAT_SCALE_SHIFT_& a, const CvMAT& b )
1819 { return _CvMAT_MUL_ADD_( a.a, &b, a.alpha, &b, a.beta, 0 ); }
1821 /* mmuladd = mat * mat_scaled_shifted */
1822 inline _CvMAT_MUL_ADD_ operator * ( const CvMAT& b, const _CvMAT_SCALE_SHIFT_& a )
1823 { return _CvMAT_MUL_ADD_( &b, a.a, a.alpha, &b, a.beta, 0 ); }
1825 /* mmuladd = mat_scaled_shifted * mat_scaled */
1826 inline _CvMAT_MUL_ADD_ operator * ( const _CvMAT_SCALE_SHIFT_& a, const _CvMAT_SCALE_& b )
1827 { return _CvMAT_MUL_ADD_( a.a, b.a, a.alpha*b.alpha, b.a, a.beta*b.alpha, 0 ); }
1829 /* mmuladd = mat_scaled * mat_scaled_shifted */
1830 inline _CvMAT_MUL_ADD_ operator * ( const _CvMAT_SCALE_& b, const _CvMAT_SCALE_SHIFT_& a )
1831 { return _CvMAT_MUL_ADD_( b.a, a.a, a.alpha*b.alpha, b.a, a.beta*b.alpha, 0 ); }
1833 /* mmuladd = mat_scaled_shifted * (mat^t) */
1834 inline _CvMAT_MUL_ADD_ operator * ( const _CvMAT_SCALE_SHIFT_& a, const _CvMAT_T_& b )
1835 { return _CvMAT_MUL_ADD_( a.a, &b.a, a.alpha*b.alpha, &b.a, a.beta*b.alpha, 6 ); }
1837 /* mmuladd = (mat^t) * mat_scaled_shifted */
1838 inline _CvMAT_MUL_ADD_ operator * ( const _CvMAT_T_& b, const _CvMAT_SCALE_SHIFT_& a )
1839 { return _CvMAT_MUL_ADD_( &b.a, a.a, a.alpha*b.alpha, &b.a, a.beta*b.alpha, 5 ); }
1841 /* mmuladd2 = mmuladd1 * scalar */
1842 inline _CvMAT_MUL_ADD_ operator * ( const _CvMAT_MUL_ADD_& a, double alpha )
1843 { return _CvMAT_MUL_ADD_( a.a, a.b, a.alpha*alpha, a.c, a.beta*alpha, a.t_abc ); }
1845 /* mmuladd2 = scalar * mmuladd1 */
1846 inline _CvMAT_MUL_ADD_ operator * ( double alpha, const _CvMAT_MUL_ADD_& a )
1847 { return _CvMAT_MUL_ADD_( a.a, a.b, a.alpha*alpha, a.c, a.beta*alpha, a.t_abc ); }
1850 inline _CvMAT_MUL_ADD_ operator - ( const _CvMAT_MUL_ADD_& a )
1851 { return _CvMAT_MUL_ADD_( a.a, a.b, -a.alpha, a.c, -a.beta, a.t_abc ); }
1853 /* inv(a)*b, i.e. solve a*x = b */
1854 inline _CvMAT_SOLVE_ operator * ( const _CvMAT_INV_& a, const CvMAT& b )
1855 { return _CvMAT_SOLVE_( &a.a, &b, a.method ); }
1859 * PART III. Logical operations
1861 inline _CvMAT_NOT_ operator ~ ( const CvMAT& a )
1862 { return _CvMAT_NOT_(&a); }
1864 inline _CvMAT_LOGIC_ operator & ( const CvMAT& a, const CvMAT& b )
1865 { return _CvMAT_LOGIC_( &a, &b, _CvMAT_LOGIC_::AND, 0 ); }
1867 inline _CvMAT_LOGIC_ operator & ( const _CvMAT_NOT_& a, const CvMAT& b )
1868 { return _CvMAT_LOGIC_( a.a, &b, _CvMAT_LOGIC_::AND, 1 ); }
1870 inline _CvMAT_LOGIC_ operator & ( const CvMAT& a, const _CvMAT_NOT_& b )
1871 { return _CvMAT_LOGIC_( &a, b.a, _CvMAT_LOGIC_::AND, 2 ); }
1873 inline _CvMAT_LOGIC_ operator & ( const _CvMAT_NOT_& a, const _CvMAT_NOT_& b )
1874 { return _CvMAT_LOGIC_( a.a, b.a, _CvMAT_LOGIC_::AND, 3 ); }
1877 inline _CvMAT_LOGIC_ operator | ( const CvMAT& a, const CvMAT& b )
1878 { return _CvMAT_LOGIC_( &a, &b, _CvMAT_LOGIC_::OR, 0 ); }
1880 inline _CvMAT_LOGIC_ operator | ( const _CvMAT_NOT_& a, const CvMAT& b )
1881 { return _CvMAT_LOGIC_( a.a, &b, _CvMAT_LOGIC_::OR, 1 ); }
1883 inline _CvMAT_LOGIC_ operator | ( const CvMAT& a, const _CvMAT_NOT_& b )
1884 { return _CvMAT_LOGIC_( &a, b.a, _CvMAT_LOGIC_::OR, 2 ); }
1886 inline _CvMAT_LOGIC_ operator | ( const _CvMAT_NOT_& a, const _CvMAT_NOT_& b )
1887 { return _CvMAT_LOGIC_( a.a, b.a, _CvMAT_LOGIC_::OR, 3 ); }
1890 inline _CvMAT_LOGIC_ operator ^ ( const CvMAT& a, const CvMAT& b )
1891 { return _CvMAT_LOGIC_( &a, &b, _CvMAT_LOGIC_::XOR, 0 ); }
1893 inline _CvMAT_LOGIC_ operator ^ ( const _CvMAT_NOT_& a, const CvMAT& b )
1894 { return _CvMAT_LOGIC_( a.a, &b, _CvMAT_LOGIC_::XOR, 1 ); }
1896 inline _CvMAT_LOGIC_ operator ^ ( const CvMAT& a, const _CvMAT_NOT_& b )
1897 { return _CvMAT_LOGIC_( &a, b.a, _CvMAT_LOGIC_::XOR, 2 ); }
1899 inline _CvMAT_LOGIC_ operator ^ ( const _CvMAT_NOT_& a, const _CvMAT_NOT_& b )
1900 { return _CvMAT_LOGIC_( a.a, b.a, _CvMAT_LOGIC_::XOR, 3 ); }
1903 inline _CvMAT_UN_LOGIC_ operator & ( const CvMAT& a, double alpha )
1904 { return _CvMAT_UN_LOGIC_( &a, alpha, _CvMAT_LOGIC_::AND, 0 ); }
1906 inline _CvMAT_UN_LOGIC_ operator & ( double alpha, const CvMAT& a )
1907 { return _CvMAT_UN_LOGIC_( &a, alpha, _CvMAT_LOGIC_::AND, 0 ); }
1909 inline _CvMAT_UN_LOGIC_ operator & ( const _CvMAT_NOT_& a, double alpha )
1910 { return _CvMAT_UN_LOGIC_( a.a, alpha, _CvMAT_LOGIC_::AND, 1 ); }
1912 inline _CvMAT_UN_LOGIC_ operator & ( double alpha, const _CvMAT_NOT_& a )
1913 { return _CvMAT_UN_LOGIC_( a.a, alpha, _CvMAT_LOGIC_::AND, 1 ); }
1916 inline _CvMAT_UN_LOGIC_ operator | ( const CvMAT& a, double alpha )
1917 { return _CvMAT_UN_LOGIC_( &a, alpha, _CvMAT_LOGIC_::OR, 0 ); }
1919 inline _CvMAT_UN_LOGIC_ operator | ( double alpha, const CvMAT& a )
1920 { return _CvMAT_UN_LOGIC_( &a, alpha, _CvMAT_LOGIC_::OR, 0 ); }
1922 inline _CvMAT_UN_LOGIC_ operator | ( const _CvMAT_NOT_& a, double alpha )
1923 { return _CvMAT_UN_LOGIC_( a.a, alpha, _CvMAT_LOGIC_::OR, 1 ); }
1925 inline _CvMAT_UN_LOGIC_ operator | ( double alpha, const _CvMAT_NOT_& a )
1926 { return _CvMAT_UN_LOGIC_( a.a, alpha, _CvMAT_LOGIC_::OR, 1 ); }
1929 inline _CvMAT_UN_LOGIC_ operator ^ ( const CvMAT& a, double alpha )
1930 { return _CvMAT_UN_LOGIC_( &a, alpha, _CvMAT_LOGIC_::XOR, 0 ); }
1932 inline _CvMAT_UN_LOGIC_ operator ^ ( double alpha, const CvMAT& a )
1933 { return _CvMAT_UN_LOGIC_( &a, alpha, _CvMAT_LOGIC_::XOR, 0 ); }
1935 inline _CvMAT_UN_LOGIC_ operator ^ ( const _CvMAT_NOT_& a, double alpha )
1936 { return _CvMAT_UN_LOGIC_( a.a, alpha, _CvMAT_LOGIC_::XOR, 1 ); }
1938 inline _CvMAT_UN_LOGIC_ operator ^ ( double alpha, const _CvMAT_NOT_& a )
1939 { return _CvMAT_UN_LOGIC_( a.a, alpha, _CvMAT_LOGIC_::XOR, 1 ); }
1943 * PART IV. Comparison operations
1945 inline _CvMAT_CMP_ operator > ( const CvMAT& a, const CvMAT& b )
1946 { return _CvMAT_CMP_( &a, &b, CV_CMP_GT ); }
1948 inline _CvMAT_CMP_ operator >= ( const CvMAT& a, const CvMAT& b )
1949 { return _CvMAT_CMP_( &a, &b, CV_CMP_GE ); }
1951 inline _CvMAT_CMP_ operator < ( const CvMAT& a, const CvMAT& b )
1952 { return _CvMAT_CMP_( &a, &b, CV_CMP_LT ); }
1954 inline _CvMAT_CMP_ operator <= ( const CvMAT& a, const CvMAT& b )
1955 { return _CvMAT_CMP_( &a, &b, CV_CMP_LE ); }
1957 inline _CvMAT_CMP_ operator == ( const CvMAT& a, const CvMAT& b )
1958 { return _CvMAT_CMP_( &a, &b, CV_CMP_EQ ); }
1960 inline _CvMAT_CMP_ operator != ( const CvMAT& a, const CvMAT& b )
1961 { return _CvMAT_CMP_( &a, &b, CV_CMP_NE ); }
1964 inline _CvMAT_CMP_ operator > ( const CvMAT& a, double alpha )
1965 { return _CvMAT_CMP_( &a, alpha, CV_CMP_GT ); }
1967 inline _CvMAT_CMP_ operator > ( double alpha, const CvMAT& a )
1968 { return _CvMAT_CMP_( &a, alpha, CV_CMP_LT ); }
1970 inline _CvMAT_CMP_ operator >= ( const CvMAT& a, double alpha )
1971 { return _CvMAT_CMP_( &a, alpha, CV_CMP_GE ); }
1973 inline _CvMAT_CMP_ operator >= ( double alpha, const CvMAT& a )
1974 { return _CvMAT_CMP_( &a, alpha, CV_CMP_LE ); }
1976 inline _CvMAT_CMP_ operator < ( const CvMAT& a, double alpha )
1977 { return _CvMAT_CMP_( &a, alpha, CV_CMP_LT ); }
1979 inline _CvMAT_CMP_ operator < ( double alpha, const CvMAT& a )
1980 { return _CvMAT_CMP_( &a, alpha, CV_CMP_GT ); }
1982 inline _CvMAT_CMP_ operator <= ( const CvMAT& a, double alpha )
1983 { return _CvMAT_CMP_( &a, alpha, CV_CMP_LE ); }
1985 inline _CvMAT_CMP_ operator <= ( double alpha, const CvMAT& a )
1986 { return _CvMAT_CMP_( &a, alpha, CV_CMP_GE ); }
1988 inline _CvMAT_CMP_ operator == ( const CvMAT& a, double alpha )
1989 { return _CvMAT_CMP_( &a, alpha, CV_CMP_EQ ); }
1991 inline _CvMAT_CMP_ operator == ( double alpha, const CvMAT& a )
1992 { return _CvMAT_CMP_( &a, alpha, CV_CMP_EQ ); }
1994 inline _CvMAT_CMP_ operator != ( const CvMAT& a, double alpha )
1995 { return _CvMAT_CMP_( &a, alpha, CV_CMP_NE ); }
1997 inline _CvMAT_CMP_ operator != ( double alpha, const CvMAT& a )
1998 { return _CvMAT_CMP_( &a, alpha, CV_CMP_NE ); }
2002 * PART V. Speedup for some augmented assignments to CvMAT
2005 inline CvMAT& CvMAT::operator += ( const _CvMAT_SCALE_& scale_mat )
2006 { return (*this = *this + scale_mat); }
2008 inline CvMAT& CvMAT::operator += ( const _CvMAT_SCALE_SHIFT_& scale_mat )
2009 { return (*this = *this + scale_mat); }
2011 inline CvMAT& CvMAT::operator += ( const _CvMAT_MUL_& mmul )
2012 { return (*this = mmul + *this); }
2014 inline CvMAT& CvMAT::operator -= ( const _CvMAT_SCALE_& scale_mat )
2015 { return (*this = *this - scale_mat); }
2017 inline CvMAT& CvMAT::operator -= ( const _CvMAT_SCALE_SHIFT_& scale_mat )
2018 { return (*this = *this - scale_mat); }
2020 inline CvMAT& CvMAT::operator -= ( const _CvMAT_MUL_& mmul )
2021 { return (*this = -mmul + *this); }
2023 inline CvMAT& CvMAT::operator *= ( const _CvMAT_SCALE_& scale_mat )
2024 { return (*this = *this * scale_mat); }
2026 inline CvMAT& CvMAT::operator *= ( const _CvMAT_SCALE_SHIFT_& scale_mat )
2027 { return (*this = *this * scale_mat); }
2029 /****************************************************************************************\
2030 * misc. operations on temporary matrices (+,-,*) *
2031 \****************************************************************************************/
2034 * the base proxy class implementation
2038 inline _CvMAT_DOT_OP_ _CvMAT_BASE_OP_::mul( const CvMAT& a ) const
2039 { return ((CvMAT)*this).mul(a); }
2042 inline _CvMAT_DOT_OP_ _CvMAT_BASE_OP_::mul( const _CvMAT_SCALE_& a ) const
2043 { return ((CvMAT)*this).mul(a); }
2046 inline _CvMAT_DOT_OP_ _CvMAT_BASE_OP_::div( const CvMAT& a ) const
2047 { return ((CvMAT)*this).div(a); }
2050 inline _CvMAT_DOT_OP_ _CvMAT_BASE_OP_::div( const _CvMAT_SCALE_& a ) const
2051 { return ((CvMAT)*this).div(a); }
2054 inline _CvMAT_DOT_OP_ _CvMAT_BASE_OP_::min( const CvMAT& a ) const
2055 { return ((CvMAT)*this).min(a); }
2058 inline _CvMAT_DOT_OP_ _CvMAT_BASE_OP_::max( const CvMAT& a ) const
2059 { return ((CvMAT)*this).max(a); }
2062 inline _CvMAT_DOT_OP_ _CvMAT_BASE_OP_::min( double alpha ) const
2063 { return ((CvMAT)*this).min(alpha); }
2066 inline _CvMAT_DOT_OP_ _CvMAT_BASE_OP_::max( double alpha ) const
2067 { return ((CvMAT)*this).max(alpha); }
2070 inline _CvMAT_INV_ _CvMAT_BASE_OP_::inv( int method ) const
2071 { return ((CvMAT)*this).inv(method); }
2073 inline _CvMAT_T_ _CvMAT_BASE_OP_::t() const
2074 { return ((CvMAT)*this).t(); }
2076 inline _CvMAT_CVT_ _CvMAT_BASE_OP_::cvt( int newdepth, double scale, double shift ) const
2077 { return ((CvMAT)*this).cvt( newdepth, scale, shift ); }
2079 inline CvMAT _CvMAT_BASE_OP_::row( int r ) const
2080 { return CvMAT((CvMAT)*this, 0, r ); }
2082 inline CvMAT _CvMAT_BASE_OP_::rowrange( int row1, int row2 ) const
2084 CvMAT m = (CvMAT)*this;
2085 assert( 0 <= row1 && row1 < row2 && row2 <= m.height );
2086 return CvMAT( m, cvRect( 0, row1, m.width, row2 - row1 ));
2089 inline CvMAT _CvMAT_BASE_OP_::col( int c ) const
2090 { return CvMAT( (CvMAT)*this, 1, c ); }
2092 inline CvMAT _CvMAT_BASE_OP_::colrange( int col1, int col2 ) const
2094 CvMAT m = (CvMAT)*this;
2095 assert( 0 <= col1 && col1 < col2 && col2 <= m.width );
2096 return CvMAT( m, cvRect( col1, 0, col2 - col1, m.height ));
2099 inline CvMAT _CvMAT_BASE_OP_::rect( CvRect r ) const
2100 { return CvMAT( (CvMAT)*this, r ); }
2102 inline CvMAT _CvMAT_BASE_OP_::diag( int d ) const
2103 { return CvMAT( (CvMAT)*this, -1, d ); }
2105 inline double _CvMAT_BASE_OP_::det() const
2106 { return ((CvMAT)*this).det(); }
2108 inline double _CvMAT_BASE_OP_::norm( int norm_type ) const
2109 { return ((CvMAT)*this).norm( norm_type ); }
2111 inline CvScalar _CvMAT_BASE_OP_::sum() const
2112 { return ((CvMAT)*this).sum(); }
2114 inline double _CvMAT_BASE_OP_::min( CvPoint* minloc ) const
2115 { return ((CvMAT)*this).min( minloc ); }
2117 inline double _CvMAT_BASE_OP_::max( CvPoint* maxloc ) const
2118 { return ((CvMAT)*this).max( maxloc ); }
2121 /****************************************************************************************/
2122 /* proxy classes implementation. */
2123 /* part I. constructors */
2124 /****************************************************************************************/
2127 inline _CvMAT_COPY_::_CvMAT_COPY_( const CvMAT* _a ) : a((CvMAT*)_a) {}
2129 inline _CvMAT_CVT_::_CvMAT_CVT_( const CvMAT* _a, int _newdepth,
2130 double _scale, double _shift ) :
2131 a(*(CvMAT*)_a), newdepth(_newdepth), scale(_scale), shift(_shift) {}
2133 inline _CvMAT_T_::_CvMAT_T_( const CvMAT* _a ) : a(*(CvMAT*)_a), alpha(1) {}
2136 inline _CvMAT_T_::_CvMAT_T_( const CvMAT* _a, double _alpha ) :
2137 a(*(CvMAT*)_a), alpha(_alpha) {}
2140 inline _CvMAT_INV_::_CvMAT_INV_( const CvMAT* _a, int _method ) :
2141 a(*(CvMAT*)_a), method(_method) {}
2144 inline _CvMAT_MUL_::_CvMAT_MUL_( const CvMAT* _a, const CvMAT* _b, int _t_ab ) :
2145 a((CvMAT*)_a), b((CvMAT*)_b), alpha(1), t_ab(_t_ab) {}
2148 inline _CvMAT_MUL_::_CvMAT_MUL_( const CvMAT* _a, const CvMAT* _b,
2149 double _alpha, int _t_ab ) :
2150 a((CvMAT*)_a), b((CvMAT*)_b), alpha(_alpha), t_ab(_t_ab) {}
2153 inline _CvMAT_MUL_ADD_::_CvMAT_MUL_ADD_( const CvMAT* _a, const CvMAT* _b,
2154 const CvMAT* _c, int _t_abc ) :
2155 a((CvMAT*)_a), b((CvMAT*)_b), c((CvMAT*)_c), t_abc(_t_abc) {}
2158 inline _CvMAT_MUL_ADD_::_CvMAT_MUL_ADD_( const CvMAT* _a, const CvMAT* _b, double _alpha,
2159 const CvMAT* _c, double _beta, int _t_abc ) :
2160 a((CvMAT*)_a), b((CvMAT*)_b), alpha(_alpha),
2161 c((CvMAT*)_c), beta(_beta), t_abc(_t_abc) {}
2164 inline _CvMAT_ADD_::_CvMAT_ADD_( const CvMAT* _a, const CvMAT* _b, double _beta ) :
2165 a((CvMAT*)_a), b((CvMAT*)_b), beta(_beta) {}
2168 inline _CvMAT_ADD_EX_::_CvMAT_ADD_EX_( const CvMAT* _a, double _alpha,
2169 const CvMAT* _b, double _beta, double _gamma ) :
2170 a((CvMAT*)_a), alpha(_alpha), b((CvMAT*)_b), beta(_beta), gamma(_gamma) {}
2173 inline _CvMAT_SCALE_::_CvMAT_SCALE_( const CvMAT* _a, double _alpha ) :
2174 a((CvMAT*)_a), alpha(_alpha) {}
2177 inline _CvMAT_SCALE_SHIFT_::_CvMAT_SCALE_SHIFT_( const CvMAT* _a,
2178 double _alpha, double _beta ) :
2179 a((CvMAT*)_a), alpha(_alpha), beta(_beta) {}
2182 inline _CvMAT_LOGIC_::_CvMAT_LOGIC_( const CvMAT* _a, const CvMAT* _b,
2183 _CvMAT_LOGIC_::Op _op, int _flags ) :
2184 a((CvMAT*)_a), b((CvMAT*)_b), op(_op), flags(_flags) {}
2187 inline _CvMAT_UN_LOGIC_::_CvMAT_UN_LOGIC_( const CvMAT* _a, double _alpha,
2188 _CvMAT_LOGIC_::Op _op, int _flags ) :
2189 a((CvMAT*)_a), alpha(_alpha), op(_op), flags(_flags) {}
2192 inline _CvMAT_NOT_::_CvMAT_NOT_( const CvMAT* _a ) :
2196 inline _CvMAT_DOT_OP_::_CvMAT_DOT_OP_( const CvMAT* _a, const CvMAT* _b,
2197 int _op, double _alpha ) :
2198 a(*_a), b((CvMAT*)_b), op(_op), alpha(_alpha) {}
2201 inline _CvMAT_SOLVE_::_CvMAT_SOLVE_( const CvMAT* _a, const CvMAT* _b, int _method ) :
2202 a((CvMAT*)_a), b((CvMAT*)_b), method(_method) {}
2204 inline _CvMAT_CMP_::_CvMAT_CMP_( const CvMAT* _a, const CvMAT* _b, int _cmp_op ) :
2205 a((CvMAT*)_a), b((CvMAT*)_b), alpha(0), cmp_op(_cmp_op) {}
2207 inline _CvMAT_CMP_::_CvMAT_CMP_( const CvMAT* _a, double _alpha, int _cmp_op ) :
2208 a((CvMAT*)_a), b(0), alpha(_alpha), cmp_op(_cmp_op) {}
2210 /****************************************************************************************/
2211 /* proxy classes implementation. */
2212 /* part II. conversion to CvMAT */
2213 /****************************************************************************************/
2215 inline _CvMAT_T_::operator CvMAT() const
2216 { return CvMAT( *this ); }
2218 inline _CvMAT_INV_::operator CvMAT() const
2219 { return CvMAT( *this ); }
2221 inline _CvMAT_MUL_::operator CvMAT() const
2222 { return CvMAT( *this ); }
2224 inline _CvMAT_SCALE_::operator CvMAT() const
2225 { return CvMAT( *this ); }
2227 inline _CvMAT_SCALE_SHIFT_::operator CvMAT() const
2228 { return CvMAT( *this ); }
2230 inline _CvMAT_ADD_::operator CvMAT() const
2231 { return CvMAT( *this ); }
2233 inline _CvMAT_ADD_EX_::operator CvMAT() const
2234 { return CvMAT( *this ); }
2236 inline _CvMAT_MUL_ADD_::operator CvMAT() const
2237 { return CvMAT( *this ); }
2239 inline _CvMAT_LOGIC_::operator CvMAT() const
2240 { return CvMAT( *this ); }
2242 inline _CvMAT_UN_LOGIC_::operator CvMAT() const
2243 { return CvMAT( *this ); }
2245 inline _CvMAT_NOT_::operator CvMAT() const
2246 { return CvMAT( *this ); }
2248 inline _CvMAT_DOT_OP_::operator CvMAT() const
2249 { return CvMAT( *this ); }
2251 inline _CvMAT_SOLVE_::operator CvMAT() const
2252 { return CvMAT( *this ); }
2254 inline _CvMAT_CMP_::operator CvMAT() const
2255 { return CvMAT( *this ); }
2257 inline _CvMAT_CVT_::operator CvMAT() const
2258 { return CvMAT(*this); }
2260 inline _CvMAT_COPY_::operator CvMAT() const
2263 /****************************************************************************************/
2264 /* proxy classes implementation. */
2265 /* part III. custom overrided methods */
2266 /****************************************************************************************/
2268 inline _CvMAT_DOT_OP_ _CvMAT_SCALE_::mul( const CvMAT& mat ) const
2269 { return _CvMAT_DOT_OP_( a, &mat, '*', alpha ); }
2271 inline _CvMAT_DOT_OP_ _CvMAT_SCALE_::mul( const _CvMAT_SCALE_& mat ) const
2272 { return _CvMAT_DOT_OP_( a, mat.a, '*', alpha*mat.alpha ); }
2274 inline _CvMAT_DOT_OP_ _CvMAT_SCALE_::div( const CvMAT& mat ) const
2275 { return _CvMAT_DOT_OP_( a, &mat, '/', alpha ); }
2277 inline _CvMAT_DOT_OP_ _CvMAT_SCALE_::div( const _CvMAT_SCALE_& mat ) const
2278 { return _CvMAT_DOT_OP_( a, mat.a, '/', alpha/mat.alpha ); }
2280 inline _CvMAT_DOT_OP_ operator * ( const _CvMAT_DOT_OP_& dot_op, double alpha )
2281 { return _CvMAT_DOT_OP_( &dot_op.a, dot_op.b, dot_op.op, dot_op.alpha * alpha ); }
2283 inline _CvMAT_DOT_OP_ operator * ( double alpha, const _CvMAT_DOT_OP_& dot_op )
2284 { return _CvMAT_DOT_OP_( &dot_op.a, dot_op.b, dot_op.op, dot_op.alpha * alpha ); }
2286 inline _CvMAT_DOT_OP_ operator / ( double alpha, const CvMAT& mat )
2287 { return _CvMAT_DOT_OP_( &mat, 0, '/', alpha ); }
2289 inline _CvMAT_DOT_OP_ operator / ( double alpha, const _CvMAT_SCALE_& mat )
2290 { return _CvMAT_DOT_OP_( mat.a, 0, '/', alpha/mat.alpha ); }
2293 inline double _CvMAT_T_::det() const
2296 inline double _CvMAT_T_::norm( int norm_type ) const
2297 { return a.norm( norm_type ); }
2299 inline double _CvMAT_ADD_::norm( int norm_type ) const
2302 return cvNorm( a, b, norm_type );
2304 return ((CvMAT)*this).norm( norm_type );
2307 inline _CvMAT_DOT_OP_ _CvMAT_ADD_::abs() const
2310 return _CvMAT_DOT_OP_( a, b, 'a', 0 );
2312 return ((CvMAT)*this).abs();
2315 inline _CvMAT_DOT_OP_ _CvMAT_SCALE_SHIFT_::abs() const
2318 return _CvMAT_DOT_OP_( a, 0, 'a', -beta );
2320 return ((CvMAT)*this).abs();
2323 #endif /* __cplusplus */
2325 #endif /*_CVMAT_HPP_*/