cxmat.hpp
上传用户:soukeisyuu
上传日期:2022-07-03
资源大小:5943k
文件大小:148k
源码类别:

波变换

开发平台:

Visual C++

  1. }
  2. static inline Mat& operator *= (const Mat& a, double alpha)
  3. {
  4.     a.convertTo((Mat&)a, -1, alpha);
  5.     return (Mat&)a;
  6. }
  7. static inline Mat& operator += (const Mat& a, const Scalar& s)
  8. {
  9.     add(a, s, (Mat&)a);
  10.     return (Mat&)a;
  11. }
  12. static inline Mat& operator -= (const Mat& a, const Scalar& s)
  13. { return (a += -s); }
  14. template<typename _Tp> static inline
  15. Mat_<_Tp>& operator += (const Mat_<_Tp>& a, const Mat_<_Tp>& b)
  16. {
  17.     (Mat&)a += (const Mat&)b;
  18.     return (Mat_<_Tp>&)a;
  19. }
  20. template<typename _Tp> static inline
  21. Mat_<_Tp>& operator -= (const Mat_<_Tp>& a, const Mat_<_Tp>& b)
  22. {
  23.     (Mat&)a -= (const Mat&)b;
  24.     return (Mat_<_Tp>&)a;
  25. }
  26. template<typename _Tp> static inline
  27. Mat_<_Tp>& operator *= (const Mat_<_Tp>& a, const Mat_<_Tp>& b)
  28. {
  29.     (Mat&)a *= (const Mat&)b;
  30.     return (Mat_<_Tp>&)a;
  31. }
  32. template<typename _Tp> static inline
  33. Mat_<_Tp>& operator += (const Mat_<_Tp>& a, const Scalar& s)
  34. {
  35.     (Mat&)a += s;
  36.     return (Mat_<_Tp>&)a;
  37. }
  38. template<typename _Tp> static inline
  39. Mat_<_Tp>& operator -= (const Mat_<_Tp>& a, const Scalar& s)
  40. {
  41.     (Mat&)a -= s;
  42.     return (Mat_<_Tp>&)a;
  43. }
  44. template<typename A, typename M> static inline
  45. M& operator += (const M& a, const MatExpr_<A, M>& b)
  46. { return (a += (M)b); }
  47. template<typename A, typename M> static inline
  48. M& operator -= (const M& a, const MatExpr_<A, M>& b)
  49. { return (a -= (M)b); }
  50. template<typename A, typename M> static inline
  51. M& operator *= (const M& a, const MatExpr_<A, M>& b)
  52. { return (a *= (M)b); }
  53. template<typename A, typename M> static inline
  54. M& operator += (const M& a,
  55.                 const MatExpr_<MatExpr_Op2_<A, double, M, MatOp_Scale_<Mat> >, M>& b)
  56. {
  57.     M& _a = (M&)a;
  58.     scaleAdd( b.e.a1, Scalar(b.e.a2), _a, _a );
  59.     return _a;
  60. }
  61. template<typename A, typename M> static inline
  62. M& operator -= (const M& a,
  63.                 const MatExpr_<MatExpr_Op2_<A, double, M, MatOp_Scale_<Mat> >, M>& b)
  64. {
  65.     M& _a = (M&)a;
  66.     scaleAdd( b.e.a1, -Scalar(b.e.a2), _a, _a );
  67.     return _a;
  68. }
  69. template<typename A, typename M> static inline
  70. M& operator += (const M& a,
  71.                 const MatExpr_<MatExpr_Op3_<A, double, double, M, MatOp_ScaleAddS_<Mat> >, M>& b)
  72. {
  73.     M& _a = (M&)a;
  74.     MatOp_AddEx_<Mat>::apply( a, 1, (M)b.e.a1, b.e.a2, b.e.a3, _a );
  75.     return _a;
  76. }
  77. template<typename A, typename M> static inline
  78. M& operator -= (const M& a,
  79.                 const MatExpr_<MatExpr_Op3_<A, double, double, M, MatOp_ScaleAddS_<Mat> >, M>& b)
  80. {
  81.     M& _a = (M&)a;
  82.     MatOp_AddEx_<Mat>::apply( a, 1, (M)b.e.a1, -b.e.a2, -b.e.a3, _a );
  83.     return _a;
  84. }
  85. template<typename A, typename B, typename M> static inline
  86. M& operator += (const M& a,
  87.                 const MatExpr_<MatExpr_Op4_<A, B, double, int, M, MatOp_MatMul_<Mat> >, M>& b)
  88. {
  89.     M& _a = (M&)a;
  90.     MatOp_MatMulAdd_<Mat>::apply( (M)b.e.a1, (M)b.e.a2, b.e.a3, a, 1, b.e.a4, _a );
  91.     return _a;
  92. }
  93. template<typename A, typename B, typename M> static inline
  94. M& operator -= (const M& a,
  95.                 const MatExpr_<MatExpr_Op4_<A, B, double, int, M, MatOp_MatMul_<Mat> >, M>& b)
  96. {
  97.     M& _a = (M&)a;
  98.     MatOp_MatMulAdd_<Mat>::apply( (M)b.e.a1, (M)b.e.a2, -b.e.a3, a, 1, b.e.a4, _a );
  99.     return _a;
  100. }
  101. template<typename A, typename M> static inline
  102. M& operator *= (const M& a,
  103.                 const MatExpr_<MatExpr_Op2_<A, double, M, MatOp_Scale_<Mat> >, M>& b)
  104. {
  105.     M& _a = (M&)a;
  106.     MatOp_MatMul_<Mat>::apply( a, (M)b.e.a1, b.e.a2, 0, _a );
  107.     return _a;
  108. }
  109. template<typename A, typename M> static inline
  110. M& operator *= (const M& a,
  111.                 const MatExpr_<MatExpr_Op3_<A, double, double, M, MatOp_ScaleAddS_<Mat> >, M>& b)
  112. {
  113.     M& _a = (M&)a;
  114.     MatOp_MatMulAdd_<Mat>::apply( a, (M)b.e.a1, b.e.a2, a, b.e.a3, 0, _a );
  115.     return _a;
  116. }
  117. template<typename A, typename M> static inline
  118. M& operator *= (const M& a,
  119.                 const MatExpr_<MatExpr_Op2_<A, double, M, MatOp_T_<Mat> >, M>& b)
  120. {
  121.     M& _a = (M&)a;
  122.     MatOp_MatMul_<Mat>::apply( a, (M)b.e.a1, b.e.a2, GEMM_2_T, _a );
  123.     return _a;
  124. }
  125. ////////////////////////////// Logical operations ///////////////////////////////
  126. static inline MatExpr_<MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Bin_<Mat> >, Mat>
  127. operator & (const Mat& a, const Mat& b)
  128. {
  129.     typedef MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Bin_<Mat> > MatExpr_Temp;
  130.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, b, '&'));
  131. }
  132. static inline MatExpr_<MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Bin_<Mat> >, Mat>
  133. operator | (const Mat& a, const Mat& b)
  134. {
  135.     typedef MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Bin_<Mat> > MatExpr_Temp;
  136.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, b, '|'));
  137. }
  138. static inline MatExpr_<MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Bin_<Mat> >, Mat>
  139. operator ^ (const Mat& a, const Mat& b)
  140. {
  141.     typedef MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Bin_<Mat> > MatExpr_Temp;
  142.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, b, '^'));
  143. }
  144. template<typename _Tp> static inline
  145. MatExpr_<MatExpr_Op3_<Mat_<_Tp>, Mat_<_Tp>, int, Mat_<_Tp>,
  146.             MatOp_Bin_<Mat> >, Mat_<_Tp> >
  147. operator & (const Mat_<_Tp>& a, const Mat_<_Tp>& b)
  148. {
  149.     typedef MatExpr_Op3_<Mat_<_Tp>, Mat_<_Tp>, int, Mat_<_Tp>,
  150.         MatOp_Bin_<Mat> > MatExpr_Temp;
  151.     return MatExpr_<MatExpr_Temp, Mat_<_Tp> >(MatExpr_Temp(
  152.         a, b, '&'));
  153. }
  154. template<typename _Tp> static inline
  155. MatExpr_<MatExpr_Op3_<Mat_<_Tp>, Mat_<_Tp>, int, Mat_<_Tp>,
  156.             MatOp_Bin_<Mat> >, Mat_<_Tp> >
  157. operator | (const Mat_<_Tp>& a, const Mat_<_Tp>& b)
  158. {
  159.     typedef MatExpr_Op3_<Mat_<_Tp>, Mat_<_Tp>, int, Mat_<_Tp>,
  160.         MatOp_Bin_<Mat> > MatExpr_Temp;
  161.     return MatExpr_<MatExpr_Temp, Mat_<_Tp> >(MatExpr_Temp(
  162.         a, b, '|'));
  163. }
  164. template<typename _Tp> static inline
  165. MatExpr_<MatExpr_Op3_<Mat_<_Tp>, Mat_<_Tp>, int, Mat_<_Tp>,
  166.             MatOp_Bin_<Mat> >, Mat_<_Tp> >
  167. operator ^ (const Mat_<_Tp>& a, const Mat_<_Tp>& b)
  168. {
  169.     typedef MatExpr_Op3_<Mat_<_Tp>, Mat_<_Tp>, int, Mat_<_Tp>,
  170.         MatOp_Bin_<Mat> > MatExpr_Temp;
  171.     return MatExpr_<MatExpr_Temp, Mat_<_Tp> >(MatExpr_Temp(
  172.         a, b, '^'));
  173. }
  174. template<typename A, typename B, typename M> static inline
  175. MatExpr_<MatExpr_Op3_<M, M, int, M, MatOp_Bin_<Mat> >, M>
  176. operator & (const MatExpr_<A, M>& a, const MatExpr_<B, M>& b)
  177. { return (M)a & (M)b; }
  178. template<typename A, typename M> static inline
  179. MatExpr_<MatExpr_Op3_<M, M, int, M, MatOp_Bin_<Mat> >, M>
  180. operator & (const MatExpr_<A, M>& a, const M& b)
  181. { return (M)a & b; }
  182. template<typename A, typename M> static inline
  183. MatExpr_<MatExpr_Op3_<M, M, int, M, MatOp_Bin_<Mat> >, M>
  184. operator & (const M& a, const MatExpr_<A, M>& b)
  185. { return a & (M)b; }
  186. template<typename A, typename B, typename M> static inline
  187. MatExpr_<MatExpr_Op3_<M, M, int, M, MatOp_Bin_<Mat> >, M>
  188. operator | (const MatExpr_<A, M>& a, const MatExpr_<B, M>& b)
  189. { return (M)a | (M)b; }
  190. template<typename A, typename M> static inline
  191. MatExpr_<MatExpr_Op3_<M, M, int, M, MatOp_Bin_<Mat> >, M>
  192. operator | (const MatExpr_<A, M>& a, const M& b)
  193. { return (M)a | b; }
  194. template<typename A, typename M> static inline
  195. MatExpr_<MatExpr_Op3_<M, M, int, M, MatOp_Bin_<Mat> >, M>
  196. operator | (const M& a, const MatExpr_<A, M>& b)
  197. { return a | (M)b; }
  198. template<typename A, typename B, typename M> static inline
  199. MatExpr_<MatExpr_Op3_<M, M, int, M, MatOp_Bin_<Mat> >, M>
  200. operator ^ (const MatExpr_<A, M>& a, const MatExpr_<B, M>& b)
  201. { return (M)a ^ (M)b; }
  202. template<typename A, typename M> static inline
  203. MatExpr_<MatExpr_Op3_<M, M, int, M, MatOp_Bin_<Mat> >, M>
  204. operator ^ (const MatExpr_<A, M>& a, const M& b)
  205. { return (M)a ^ b; }
  206. template<typename A, typename M> static inline
  207. MatExpr_<MatExpr_Op3_<M, M, int, M, MatOp_Bin_<Mat> >, M>
  208. operator ^ (const M& a, const MatExpr_<A, M>& b)
  209. { return a ^ (M)b; }
  210. static inline Mat& operator &= (const Mat& a, const Mat& b)
  211. {
  212.     MatOp_Bin_<Mat>::apply( a, b, '&', (Mat&)a );
  213.     return (Mat&)a;
  214. }
  215. static inline Mat& operator |= (const Mat& a, const Mat& b)
  216. {
  217.     MatOp_Bin_<Mat>::apply( a, b, '|', (Mat&)a );
  218.     return (Mat&)a;
  219. }
  220. static inline Mat& operator ^= (const Mat& a, const Mat& b)
  221. {
  222.     MatOp_Bin_<Mat>::apply( a, b, '^', (Mat&)a );
  223.     return (Mat&)a;
  224. }
  225. template<typename _Tp> static inline Mat_<_Tp>&
  226. operator &= (const Mat_<_Tp>& a, const Mat_<_Tp>& b)
  227. {
  228.     (Mat&)a &= (const Mat&)b;
  229.     return (Mat_<_Tp>&)a;
  230. }
  231. template<typename _Tp> static inline Mat_<_Tp>&
  232. operator |= (const Mat_<_Tp>& a, const Mat_<_Tp>& b)
  233. {
  234.     (Mat&)a |= (const Mat&)b;
  235.     return (Mat_<_Tp>&)a;
  236. }
  237. template<typename _Tp> static inline Mat_<_Tp>&
  238. operator ^= (const Mat_<_Tp>& a, const Mat_<_Tp>& b)
  239. {
  240.     (Mat&)a ^= (const Mat&)b;
  241.     return (Mat_<_Tp>&)a;
  242. }
  243. template<typename A, typename M> static inline M&
  244. operator &= (const M& a, const MatExpr_<A, M>& b)
  245. { return (a &= (M)b); }
  246. template<typename A, typename M> static inline M&
  247. operator |= (const M& a, const MatExpr_<A, M>& b)
  248. { return (a |= (M)b); }
  249. template<typename A, typename M> static inline M&
  250. operator ^= (const M& a, const MatExpr_<A, M>& b)
  251. { return (a ^= (M)b); }
  252. static inline MatExpr_<MatExpr_Op3_<Mat, Scalar, int, Mat, MatOp_BinS_<Mat> >, Mat>
  253. operator & (const Mat& a, const Scalar& s)
  254. {
  255.     typedef MatExpr_Op3_<Mat, Scalar, int, Mat, MatOp_BinS_<Mat> > MatExpr_Temp;
  256.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, s, '&'));
  257. }
  258. static inline MatExpr_<MatExpr_Op3_<Mat, Scalar, int, Mat, MatOp_BinS_<Mat> >, Mat>
  259. operator & (const Scalar& s, const Mat& a)
  260. { return a & s; }
  261. static inline MatExpr_<MatExpr_Op3_<Mat, Scalar, int, Mat, MatOp_BinS_<Mat> >, Mat>
  262. operator | (const Mat& a, const Scalar& s)
  263. {
  264.     typedef MatExpr_Op3_<Mat, Scalar, int, Mat, MatOp_BinS_<Mat> > MatExpr_Temp;
  265.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, s, '|'));
  266. }
  267. static inline MatExpr_<MatExpr_Op3_<Mat, Scalar, int, Mat, MatOp_BinS_<Mat> >, Mat>
  268. operator | (const Scalar& s, const Mat& a)
  269. { return a | s; }
  270. static inline MatExpr_<MatExpr_Op3_<Mat, Scalar, int, Mat, MatOp_BinS_<Mat> >, Mat>
  271. operator ^ (const Mat& a, const Scalar& s)
  272. {
  273.     typedef MatExpr_Op3_<Mat, Scalar, int, Mat, MatOp_BinS_<Mat> > MatExpr_Temp;
  274.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, s, '^'));
  275. }
  276. static inline MatExpr_<MatExpr_Op3_<Mat, Scalar, int, Mat, MatOp_BinS_<Mat> >, Mat>
  277. operator ^ (const Scalar& s, const Mat& a)
  278. { return a ^ s; }
  279. static inline MatExpr_<MatExpr_Op3_<Mat, Scalar, int, Mat, MatOp_BinS_<Mat> >, Mat>
  280. operator ~ (const Mat& a)
  281. {
  282.     typedef MatExpr_Op3_<Mat, Scalar, int, Mat, MatOp_BinS_<Mat> > MatExpr_Temp;
  283.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, Scalar(), '~'));
  284. }
  285. template<typename _Tp> static inline
  286. MatExpr_<MatExpr_Op3_<Mat_<_Tp>, Scalar, int, Mat_<_Tp>, MatOp_BinS_<Mat> >, Mat_<_Tp> >
  287. operator & (const Mat_<_Tp>& a, const Scalar& s)
  288. {
  289.     typedef MatExpr_Op3_<Mat_<_Tp>, Scalar, int, Mat_<_Tp>, MatOp_BinS_<Mat> > MatExpr_Temp;
  290.     return MatExpr_<MatExpr_Temp, Mat_<_Tp> >(MatExpr_Temp(a, s, '&'));
  291. }
  292. template<typename _Tp> static inline
  293. MatExpr_<MatExpr_Op3_<Mat_<_Tp>, Scalar, int, Mat_<_Tp>, MatOp_BinS_<Mat> >, Mat_<_Tp> >
  294. operator & (const Scalar& s, const Mat_<_Tp>& a)
  295. { return a & s; }
  296. template<typename _Tp> static inline
  297. MatExpr_<MatExpr_Op3_<Mat_<_Tp>, Scalar, int, Mat_<_Tp>, MatOp_BinS_<Mat> >, Mat_<_Tp> >
  298. operator | (const Mat_<_Tp>& a, const Scalar& s)
  299. {
  300.     typedef MatExpr_Op3_<Mat_<_Tp>, Scalar, int, Mat_<_Tp>, MatOp_BinS_<Mat> > MatExpr_Temp;
  301.     return MatExpr_<MatExpr_Temp, Mat_<_Tp> >(MatExpr_Temp(a, s, '|'));
  302. }
  303. template<typename _Tp> static inline
  304. MatExpr_<MatExpr_Op3_<Mat_<_Tp>, Scalar, int, Mat_<_Tp>, MatOp_BinS_<Mat> >, Mat_<_Tp> >
  305. operator | (const Scalar& s, const Mat_<_Tp>& a)
  306. { return a | s; }
  307. template<typename _Tp> static inline
  308. MatExpr_<MatExpr_Op3_<Mat_<_Tp>, Scalar, int, Mat_<_Tp>, MatOp_BinS_<Mat> >, Mat_<_Tp> >
  309. operator ^ (const Mat_<_Tp>& a, const Scalar& s)
  310. {
  311.     typedef MatExpr_Op3_<Mat_<_Tp>, Scalar, int, Mat_<_Tp>, MatOp_BinS_<Mat> > MatExpr_Temp;
  312.     return MatExpr_<MatExpr_Temp, Mat_<_Tp> >(MatExpr_Temp(a, s, '^'));
  313. }
  314. template<typename _Tp> static inline
  315. MatExpr_<MatExpr_Op3_<Mat_<_Tp>, Scalar, int, Mat_<_Tp>, MatOp_BinS_<Mat> >, Mat_<_Tp> >
  316. operator ^ (const Scalar& s, const Mat_<_Tp>& a)
  317. { return a ^ s; }
  318. template<typename _Tp> static inline
  319. MatExpr_<MatExpr_Op3_<Mat_<_Tp>, Scalar, int, Mat_<_Tp>, MatOp_BinS_<Mat> >, Mat_<_Tp> >
  320. operator ~ (const Mat_<_Tp>& a)
  321. {
  322.     typedef MatExpr_Op3_<Mat_<_Tp>, Scalar, int, Mat_<_Tp>, MatOp_BinS_<Mat> > MatExpr_Temp;
  323.     return MatExpr_<MatExpr_Temp, Mat_<_Tp> >(MatExpr_Temp(a, Scalar(), '~'));
  324. }
  325. template<typename A, typename M> static inline
  326. MatExpr_<MatExpr_Op3_<M, Scalar, int, M, MatOp_BinS_<Mat> >, M >
  327. operator & (const MatExpr_<A, M>& a, const Scalar& s)
  328. { return (M)a & s; }
  329. template<typename A, typename M> static inline
  330. MatExpr_<MatExpr_Op3_<M, Scalar, int, M, MatOp_BinS_<Mat> >, M >
  331. operator & (const Scalar& s, const MatExpr_<A, M>& a)
  332. { return (M)a & s; }
  333. template<typename A, typename M> static inline
  334. MatExpr_<MatExpr_Op3_<M, Scalar, int, M, MatOp_BinS_<Mat> >, M >
  335. operator | (const MatExpr_<A, M>& a, const Scalar& s)
  336. { return (M)a | s; }
  337. template<typename A, typename M> static inline
  338. MatExpr_<MatExpr_Op3_<M, Scalar, int, M, MatOp_BinS_<Mat> >, M >
  339. operator | (const Scalar& s, const MatExpr_<A, M>& a)
  340. { return (M)a | s; }
  341. template<typename A, typename M> static inline
  342. MatExpr_<MatExpr_Op3_<M, Scalar, int, M, MatOp_BinS_<Mat> >, M >
  343. operator ^ (const MatExpr_<A, M>& a, const Scalar& s)
  344. { return (M)a ^ s; }
  345. template<typename A, typename M> static inline
  346. MatExpr_<MatExpr_Op3_<M, Scalar, int, M, MatOp_BinS_<Mat> >, M >
  347. operator ^ (const Scalar& s, const MatExpr_<A, M>& a)
  348. { return (M)a ^ s; }
  349. template<typename A, typename M> static inline
  350. MatExpr_<MatExpr_Op3_<M, Scalar, int, M, MatOp_BinS_<Mat> >, M >
  351. operator ~ (const MatExpr_<A, M>& a)
  352. { return ~(M)a; }
  353. static inline Mat& operator &= (const Mat& a, const Scalar& s)
  354. {
  355.     MatOp_BinS_<Mat>::apply( a, s, '&', (Mat&)a );
  356.     return (Mat&)a;
  357. }
  358. static inline Mat& operator |= (const Mat& a, const Scalar& s)
  359. {
  360.     MatOp_BinS_<Mat>::apply( a, s, '|', (Mat&)a );
  361.     return (Mat&)a;
  362. }
  363. static inline Mat& operator ^= (const Mat& a, const Scalar& s)
  364. {
  365.     MatOp_BinS_<Mat>::apply( a, s, '^', (Mat&)a );
  366.     return (Mat&)a;
  367. }
  368. template<typename _Tp> static inline Mat_<_Tp>&
  369. operator &= (const Mat_<_Tp>& a, const Scalar& s)
  370. {
  371.     (Mat&)a &= s;
  372.     return (Mat_<_Tp>&)a;
  373. }
  374. template<typename _Tp> static inline Mat_<_Tp>&
  375. operator |= (const Mat_<_Tp>& a, const Scalar& s)
  376. {
  377.     (Mat&)a |= s;
  378.     return (Mat_<_Tp>&)a;
  379. }
  380. template<typename _Tp> static inline Mat_<_Tp>&
  381. operator ^= (const Mat_<_Tp>& a, const Scalar& s)
  382. {
  383.     (Mat&)a ^= s;
  384.     return (Mat_<_Tp>&)a;
  385. }
  386. ////////////////////////////// Comparison operations ///////////////////////////////
  387. static inline MatExpr_<MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Cmp_<Mat> >, Mat>
  388. operator == (const Mat& a, const Mat& b)
  389. {
  390.     typedef MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Cmp_<Mat> > MatExpr_Temp;
  391.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, b, CMP_EQ));
  392. }
  393. static inline MatExpr_<MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Cmp_<Mat> >, Mat>
  394. operator >= (const Mat& a, const Mat& b)
  395. {
  396.     typedef MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Cmp_<Mat> > MatExpr_Temp;
  397.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, b, CMP_GE));
  398. }
  399. static inline MatExpr_<MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Cmp_<Mat> >, Mat>
  400. operator > (const Mat& a, const Mat& b)
  401. {
  402.     typedef MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Cmp_<Mat> > MatExpr_Temp;
  403.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, b, CMP_GT));
  404. }
  405. static inline MatExpr_<MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Cmp_<Mat> >, Mat>
  406. operator <= (const Mat& a, const Mat& b)
  407. { return b >= a; }
  408. static inline MatExpr_<MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Cmp_<Mat> >, Mat>
  409. operator < (const Mat& a, const Mat& b)
  410. { return b > a; }
  411. static inline MatExpr_<MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Cmp_<Mat> >, Mat>
  412. operator != (const Mat& a, const Mat& b)
  413. {
  414.     typedef MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Cmp_<Mat> > MatExpr_Temp;
  415.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, b, CMP_NE));
  416. }
  417. static inline MatExpr_<MatExpr_Op3_<Mat, double, int, Mat, MatOp_CmpS_<Mat> >, Mat>
  418. operator == (const Mat& a, double alpha)
  419. {
  420.     typedef MatExpr_Op3_<Mat, double, int, Mat, MatOp_CmpS_<Mat> > MatExpr_Temp;
  421.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, alpha, CMP_EQ));
  422. }
  423. static inline MatExpr_<MatExpr_Op3_<Mat, double, int, Mat, MatOp_CmpS_<Mat> >, Mat>
  424. operator >= (const Mat& a, double alpha)
  425. {
  426.     typedef MatExpr_Op3_<Mat, double, int, Mat, MatOp_CmpS_<Mat> > MatExpr_Temp;
  427.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, alpha, CMP_GE));
  428. }
  429. static inline MatExpr_<MatExpr_Op3_<Mat, double, int, Mat, MatOp_CmpS_<Mat> >, Mat>
  430. operator > (const Mat& a, double alpha)
  431. {
  432.     typedef MatExpr_Op3_<Mat, double, int, Mat, MatOp_CmpS_<Mat> > MatExpr_Temp;
  433.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, alpha, CMP_GT));
  434. }
  435. static inline MatExpr_<MatExpr_Op3_<Mat, double, int, Mat, MatOp_CmpS_<Mat> >, Mat>
  436. operator <= (const Mat& a, double alpha)
  437. {
  438.     typedef MatExpr_Op3_<Mat, double, int, Mat, MatOp_CmpS_<Mat> > MatExpr_Temp;
  439.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, alpha, CMP_LE));
  440. }
  441. static inline MatExpr_<MatExpr_Op3_<Mat, double, int, Mat, MatOp_CmpS_<Mat> >, Mat>
  442. operator < (const Mat& a, double alpha)
  443. {
  444.     typedef MatExpr_Op3_<Mat, double, int, Mat, MatOp_CmpS_<Mat> > MatExpr_Temp;
  445.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, alpha, CMP_LT));
  446. }
  447. static inline MatExpr_<MatExpr_Op3_<Mat, double, int, Mat, MatOp_CmpS_<Mat> >, Mat>
  448. operator != (const Mat& a, double alpha)
  449. {
  450.     typedef MatExpr_Op3_<Mat, double, int, Mat, MatOp_CmpS_<Mat> > MatExpr_Temp;
  451.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, alpha, CMP_NE));
  452. }
  453. static inline MatExpr_<MatExpr_Op3_<Mat, double, int, Mat, MatOp_CmpS_<Mat> >, Mat>
  454. operator == (double alpha, const Mat& a)
  455. { return a == alpha; }
  456. static inline MatExpr_<MatExpr_Op3_<Mat, double, int, Mat, MatOp_CmpS_<Mat> >, Mat>
  457. operator >= (double alpha, const Mat& a)
  458. { return a <= alpha; }
  459. static inline MatExpr_<MatExpr_Op3_<Mat, double, int, Mat, MatOp_CmpS_<Mat> >, Mat>
  460. operator > (double alpha, const Mat& a)
  461. { return a < alpha; }
  462. static inline MatExpr_<MatExpr_Op3_<Mat, double, int, Mat, MatOp_CmpS_<Mat> >, Mat>
  463. operator <= (double alpha, const Mat& a)
  464. { return a >= alpha; }
  465. static inline MatExpr_<MatExpr_Op3_<Mat, double, int, Mat, MatOp_CmpS_<Mat> >, Mat>
  466. operator < (double alpha, const Mat& a)
  467. { return a > alpha; }
  468. static inline MatExpr_<MatExpr_Op3_<Mat, double, int, Mat, MatOp_CmpS_<Mat> >, Mat>
  469. operator != (double alpha, const Mat& a)
  470. { return a != alpha; }
  471. /////////////////////////////// Miscellaneous operations //////////////////////////////
  472. // max(A, B)
  473. static inline MatExpr_<MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Bin_<Mat> >, Mat>
  474. max(const Mat& a, const Mat& b)
  475. {
  476.     typedef MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Bin_<Mat> > MatExpr_Temp;
  477.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, b, 'M'));
  478. }
  479. // min(A, B)
  480. static inline MatExpr_<MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Bin_<Mat> >, Mat>
  481. min(const Mat& a, const Mat& b)
  482. {
  483.     typedef MatExpr_Op3_<Mat, Mat, int, Mat, MatOp_Bin_<Mat> > MatExpr_Temp;
  484.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, b, 'm'));
  485. }
  486. // abs(A)
  487. static inline MatExpr_<MatExpr_Op3_<Mat, Scalar, int, Mat, MatOp_BinS_<Mat> >, Mat>
  488. abs(const Mat& a)
  489. {
  490.     typedef MatExpr_Op3_<Mat, Scalar, int, Mat, MatOp_BinS_<Mat> > MatExpr_Temp;
  491.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, Scalar(0), 'a'));
  492. }
  493. // max(A, B)
  494. template<typename _Tp> static inline
  495. MatExpr_<MatExpr_Op3_<Mat_<_Tp>, Mat_<_Tp>, int, Mat_<_Tp>,
  496.             MatOp_Bin_<Mat> >, Mat_<_Tp> >
  497. max(const Mat_<_Tp>& a, const Mat_<_Tp>& b)
  498. {
  499.     typedef MatExpr_Op3_<Mat_<_Tp>, Mat_<_Tp>, int, Mat_<_Tp>,
  500.         MatOp_Bin_<Mat> > MatExpr_Temp;
  501.     return MatExpr_<MatExpr_Temp, Mat_<_Tp> >(MatExpr_Temp(
  502.         a, b, 'M'));
  503. }
  504. // min(A, B)
  505. template<typename _Tp> static inline
  506. MatExpr_<MatExpr_Op3_<Mat_<_Tp>, Mat_<_Tp>, int, Mat_<_Tp>,
  507.             MatOp_Bin_<Mat> >, Mat_<_Tp> >
  508. min(const Mat_<_Tp>& a, const Mat_<_Tp>& b)
  509. {
  510.     typedef MatExpr_Op3_<Mat_<_Tp>, Mat_<_Tp>, int, Mat_<_Tp>,
  511.         MatOp_Bin_<Mat> > MatExpr_Temp;
  512.     return MatExpr_<MatExpr_Temp, Mat_<_Tp> >(MatExpr_Temp(
  513.         a, b, 'm'));
  514. }
  515. // abs(A)
  516. template<typename _Tp> static inline
  517. MatExpr_<MatExpr_Op3_<Mat_<_Tp>, Scalar, int, Mat_<_Tp>,
  518.             MatOp_BinS_<Mat> >, Mat_<_Tp> >
  519. abs(const Mat_<_Tp>& a, const Mat_<_Tp>& b)
  520. {
  521.     typedef MatExpr_Op3_<Mat_<_Tp>, Scalar, int, Mat_<_Tp>,
  522.         MatOp_Bin_<Mat> > MatExpr_Temp;
  523.     return MatExpr_<MatExpr_Temp, Mat_<_Tp> >(MatExpr_Temp(
  524.         a, Scalar(0), 'a'));
  525. }
  526. // max(A, B)
  527. template<typename A, typename B, typename M> static inline
  528. MatExpr_<MatExpr_Op3_<M, M, int, M, MatOp_Bin_<Mat> >, M>
  529. max(const MatExpr_<A, M>& a, const MatExpr_<B, M>& b)
  530. { return max((M)a, (M)b); }
  531. template<typename A, typename M> static inline
  532. MatExpr_<MatExpr_Op3_<M, M, int, M, MatOp_Bin_<Mat> >, M>
  533. max(const MatExpr_<A, M>& a, const M& b)
  534. { return max((M)a, b); }
  535. template<typename A, typename M> static inline
  536. MatExpr_<MatExpr_Op3_<M, M, int, M, MatOp_Bin_<Mat> >, M>
  537. max(const M& a, const MatExpr_<A, M>& b)
  538. { return max(a, (M)b); }
  539. // min(A, B)
  540. template<typename A, typename B, typename M> static inline
  541. MatExpr_<MatExpr_Op3_<M, M, int, M, MatOp_Bin_<Mat> >, M>
  542. min(const MatExpr_<A, M>& a, const MatExpr_<B, M>& b)
  543. { return min((M)a, (M)b); }
  544. template<typename A, typename M> static inline
  545. MatExpr_<MatExpr_Op3_<M, M, int, M, MatOp_Bin_<Mat> >, M>
  546. min(const MatExpr_<A, M>& a, const M& b)
  547. { return min((M)a, b); }
  548. template<typename A, typename M> static inline
  549. MatExpr_<MatExpr_Op3_<M, M, int, M, MatOp_Bin_<Mat> >, M>
  550. min(const M& a, const MatExpr_<A, M>& b)
  551. { return min(a, (M)b); }
  552. // abs(A)
  553. template<typename A, typename B, typename M> static inline
  554. MatExpr_<MatExpr_Op3_<M, M, int, M, MatOp_Bin_<Mat> >, M>
  555. abs(const MatExpr_<MatExpr_Op2_<A, B, M, MatOp_Sub_<Mat> >, M>& a)
  556. {
  557.     typedef MatExpr_Op3_<M, M, int, M, MatOp_Bin_<Mat> > MatExpr_Temp;
  558.     return MatExpr_<MatExpr_Temp, M>(MatExpr_Temp((M)a.e.a1, (M)a.e.a2, 'a'));
  559. }
  560. template<typename _Tp> void merge(const Mat_<_Tp>* mvbegin, size_t count, Mat& dst)
  561. { merge( (const Mat*)mvbegin, count, dst ); }
  562. static inline void split(const Mat& m, vector<Mat>& mv)
  563. {
  564.     mv.resize(m.channels());
  565.     if(m.channels() > 0)
  566.         split(m, &mv[0]);
  567. }
  568.     
  569. template<typename _Tp> void split(const Mat& src, vector<Mat_<_Tp> >& mv)
  570. { split(src, (vector<Mat>&)mv ); }
  571.     
  572. static inline void merge(const vector<Mat>& mv, Mat& dst)
  573. { merge(&mv[0], mv.size(), dst); }
  574. static inline void mixChannels(const vector<Mat>& src, vector<Mat>& dst,
  575.                                const int* fromTo, int npairs)
  576. {
  577.     mixChannels(&src[0], (int)src.size(), &dst[0], (int)dst.size(), fromTo, npairs);
  578. }
  579.     
  580. ///// Element-wise multiplication
  581. inline MatExpr_<MatExpr_Op4_<Mat, Mat, double, char, Mat, MatOp_MulDiv_<Mat> >, Mat>
  582. Mat::mul(const Mat& m, double scale) const
  583. {
  584.     typedef MatExpr_Op4_<Mat, Mat, double, char, Mat, MatOp_MulDiv_<Mat> > MatExpr_Temp;
  585.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(*this, m, scale, '*'));
  586. }
  587. inline MatExpr_<MatExpr_Op4_<Mat, Mat, double, char, Mat, MatOp_MulDiv_<Mat> >, Mat>
  588. Mat::mul(const MatExpr_<MatExpr_Op2_<Mat, double, Mat, MatOp_Scale_<Mat> >, Mat>& m, double scale) const
  589. {
  590.     typedef MatExpr_Op4_<Mat, Mat, double, char, Mat, MatOp_MulDiv_<Mat> > MatExpr_Temp;
  591.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(*this, m.e.a1, m.e.a2*scale, '*'));
  592. }
  593. inline MatExpr_<MatExpr_Op4_<Mat, Mat, double, char, Mat, MatOp_MulDiv_<Mat> >, Mat>
  594. Mat::mul(const MatExpr_<MatExpr_Op2_<Mat, double, Mat, MatOp_DivRS_<Mat> >, Mat>& m, double scale) const
  595. {
  596.     typedef MatExpr_Op4_<Mat, Mat, double, char, Mat, MatOp_MulDiv_<Mat> > MatExpr_Temp;
  597.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(*this, m.e.a1, scale/m.e.a2, '/'));
  598. }
  599. template<typename _Tp> inline
  600. MatExpr_<MatExpr_Op4_<Mat_<_Tp>, Mat_<_Tp>, double, char, Mat_<_Tp>, MatOp_MulDiv_<Mat> >, Mat_<_Tp> >
  601. Mat_<_Tp>::mul(const Mat_<_Tp>& m, double scale) const
  602. {
  603.     typedef MatExpr_Op4_<Mat_<_Tp>, Mat_<_Tp>, double, char, Mat_<_Tp>, MatOp_MulDiv_<Mat> > MatExpr_Temp;
  604.     return MatExpr_<MatExpr_Temp, Mat_<_Tp> >(MatExpr_Temp(*this, m, scale, '*'));
  605. }
  606. template<typename _Tp> inline
  607. MatExpr_<MatExpr_Op4_<Mat_<_Tp>, Mat_<_Tp>, double, char, Mat_<_Tp>, MatOp_MulDiv_<Mat> >, Mat_<_Tp> >
  608. Mat_<_Tp>::mul(const MatExpr_<MatExpr_Op2_<Mat_<_Tp>, double, Mat_<_Tp>, MatOp_Scale_<Mat> >, Mat_<_Tp> >& m, double scale) const
  609. {
  610.     typedef MatExpr_Op4_<Mat_<_Tp>, Mat_<_Tp>, double, char, Mat_<_Tp>, MatOp_MulDiv_<Mat> > MatExpr_Temp;
  611.     return MatExpr_<MatExpr_Temp, Mat_<_Tp> >(MatExpr_Temp(*this, m.e.a1, m.e.a2*scale, '*'));
  612. }
  613. template<typename _Tp> inline
  614. MatExpr_<MatExpr_Op4_<Mat_<_Tp>, Mat_<_Tp>, double, char, Mat_<_Tp>, MatOp_MulDiv_<Mat> >, Mat_<_Tp> >
  615. Mat_<_Tp>::mul(const MatExpr_<MatExpr_Op2_<Mat_<_Tp>, double, Mat_<_Tp>, MatOp_DivRS_<Mat> >, Mat_<_Tp> >& m, double scale) const
  616. {
  617.     typedef MatExpr_Op4_<Mat_<_Tp>, Mat_<_Tp>, double, char, Mat_<_Tp>, MatOp_MulDiv_<Mat> > MatExpr_Temp;
  618.     return MatExpr_<MatExpr_Temp, Mat_<_Tp> >(MatExpr_Temp(*this, m.e.a1, scale/m.e.a2, '/'));
  619. }
  620. template<typename A, typename B, typename M> static inline
  621. MatExpr_<MatExpr_Op4_<M, M, double, char, M, MatOp_MulDiv_<Mat> >, M>
  622. operator * (const MatExpr_<MatExpr_Op4_<A, B, double, char, M, MatOp_MulDiv_<Mat> >, M>& a,
  623.             double alpha)
  624. {
  625.     typedef MatExpr_Op4_<M, M, double, char, M, MatOp_MulDiv_<Mat> > MatExpr_Temp;
  626.     return MatExpr_<MatExpr_Temp, M>(MatExpr_Temp((M)a.e.a1, (M)a.e.a2, a.e.a3*alpha, a.e.a4));
  627. }
  628. template<typename A, typename B, typename M> static inline
  629. MatExpr_<MatExpr_Op4_<M, M, double, char, M, MatOp_MulDiv_<Mat> >, M>
  630. operator * (double alpha,
  631.             const MatExpr_<MatExpr_Op4_<A, B, double, char, M, MatOp_MulDiv_<Mat> >, M>& a)
  632. { return a*alpha; }
  633. ////// Element-wise division
  634. static inline MatExpr_<MatExpr_Op4_<Mat, Mat, double, char, Mat, MatOp_MulDiv_<Mat> >, Mat>
  635. operator / (const Mat& a, const Mat& b)
  636. {
  637.     typedef MatExpr_Op4_<Mat, Mat, double, char, Mat, MatOp_MulDiv_<Mat> > MatExpr_Temp;
  638.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, b, 1, '/'));
  639. }
  640. template<typename _Tp> static inline
  641. MatExpr_<MatExpr_Op4_<Mat_<_Tp>, Mat_<_Tp>, double,
  642. char, Mat_<_Tp>, MatOp_MulDiv_<Mat> >, Mat_<_Tp> >
  643. operator / (const Mat_<_Tp>& a, const Mat_<_Tp>& b)
  644. {
  645.     typedef MatExpr_Op4_<Mat_<_Tp>, Mat_<_Tp>, double,
  646.         char, Mat_<_Tp>, MatOp_MulDiv_<Mat> > MatExpr_Temp;
  647.     return MatExpr_<MatExpr_Temp, Mat_<_Tp> >(MatExpr_Temp(a, b, 1, '/'));
  648. }
  649. template<typename A, typename B, typename M> static inline
  650. MatExpr_<MatExpr_Op4_<M, M, double, char, M, MatOp_MulDiv_<Mat> >, M>
  651. operator / (const MatExpr_<A, M>& a, const MatExpr_<B, M>& b)
  652. { return (M)a/(M)b; }
  653. template<typename A, typename M> static inline
  654. MatExpr_<MatExpr_Op4_<M, M, double, char, M, MatOp_MulDiv_<Mat> >, M>
  655. operator / (const MatExpr_<A, M>& a, const M& b)
  656. { return (M)a/b; }
  657. template<typename A, typename M> static inline
  658. MatExpr_<MatExpr_Op4_<M, M, double, char, M, MatOp_MulDiv_<Mat> >, M>
  659. operator / (const M& a, const MatExpr_<A, M>& b)
  660. { return a/(M)b; }
  661. template<typename A, typename M> static inline
  662. MatExpr_<MatExpr_Op4_<M, M, double, char, M, MatOp_MulDiv_<Mat> >, M>
  663. operator / (const MatExpr_<MatExpr_Op2_<A, double, M, MatOp_Scale_<Mat> >, M>& a,
  664.             const M& b)
  665. { return ((M)a.e.a1/b)*a.e.a2; }
  666. template<typename A, typename M> static inline
  667. MatExpr_<MatExpr_Op4_<M, M, double, char, M, MatOp_MulDiv_<Mat> >, M>
  668. operator / (const M& a,
  669.             const MatExpr_<MatExpr_Op2_<A, double, M, MatOp_Scale_<Mat> >, M>& b)
  670. { return (a/(M)b.e.a1)*(1./b.e.a2); }
  671. template<typename A, typename B, typename M> static inline
  672. MatExpr_<MatExpr_Op4_<M, M, double, char, M, MatOp_MulDiv_<Mat> >, M>
  673. operator / (const MatExpr_<MatExpr_Op2_<A, double, M, MatOp_Scale_<Mat> >, M>& a,
  674.             const MatExpr_<MatExpr_Op2_<B, double, M, MatOp_Scale_<Mat> >, M>& b)
  675. { return ((M)a.e.a1/(M)b.e.a1)*(a.e.a2/b.e.a2); }
  676. template<typename A, typename M> static inline
  677. MatExpr_<MatExpr_Op4_<M, M, double, char, M, MatOp_MulDiv_<Mat> >, M>
  678. operator / (const M& a,
  679.             const MatExpr_<MatExpr_Op2_<A, double, M, MatOp_DivRS_<Mat> >, M>& b)
  680. { return a.mul((M)b.e.a1, 1./b.e.a2); }
  681. template<typename A, typename B, typename M> static inline
  682. MatExpr_<MatExpr_Op4_<M, M, double, char, M, MatOp_MulDiv_<Mat> >, M>
  683. operator / (const MatExpr_<A, M>& a,
  684.             const MatExpr_<MatExpr_Op2_<B, double, M, MatOp_DivRS_<Mat> >, M>& b)
  685. { return ((M)a).mul((M)b.e.a1, 1./b.e.a2); }
  686. static inline
  687. MatExpr_<MatExpr_Op2_<Mat, double, Mat, MatOp_DivRS_<Mat> >, Mat >
  688. operator / (double alpha, const Mat& a)
  689. {
  690.     typedef MatExpr_Op2_<Mat, double, Mat, MatOp_DivRS_<Mat> > MatExpr_Temp;
  691.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(a, alpha));
  692. }
  693. static inline Mat& operator /= (const Mat& a, double alpha)
  694. {
  695.     MatOp_Scale_<Mat>::apply( a, 1./alpha, (Mat&)a );
  696.     return (Mat&)a;
  697. }
  698. template<typename _Tp>
  699. static inline Mat_<_Tp>& operator /= (const Mat_<_Tp>& a, double alpha)
  700. {
  701.     MatOp_Scale_<Mat>::apply( a, 1./alpha, (Mat&)a );
  702.     return (Mat_<_Tp>&)a;
  703. }
  704. template<typename _Tp> static inline
  705. MatExpr_<MatExpr_Op2_<Mat_<_Tp>, double, Mat_<_Tp>, MatOp_DivRS_<Mat> >, Mat_<_Tp> >
  706. operator / (double alpha, const Mat_<_Tp>& a)
  707. {
  708.     typedef MatExpr_Op2_<Mat_<_Tp>, double, Mat_<_Tp>,
  709.         MatOp_DivRS_<Mat> > MatExpr_Temp;
  710.     return MatExpr_<MatExpr_Temp, Mat_<_Tp> >(MatExpr_Temp(a, alpha));
  711. }
  712. template<typename A, typename M> static inline
  713. MatExpr_<MatExpr_Op2_<M, double, M, MatOp_DivRS_<Mat> >, M>
  714. operator / (double alpha, const MatExpr_<A, M>& a)
  715. { return alpha/(M)a; }
  716. template<typename A, typename M> static inline
  717. MatExpr_<MatExpr_Op2_<M, double, M, MatOp_DivRS_<Mat> >, M>
  718. operator / (double alpha,
  719.             const MatExpr_<MatExpr_Op2_<A, double, M, MatOp_Scale_<Mat> >, M>& a)
  720. { return (alpha/a.e.a2)/(M)a.e.a1; }
  721. template<typename A, typename M> static inline
  722. MatExpr_<MatExpr_Op2_<M, double, M, MatOp_Scale_<Mat> >, M>
  723. operator / (double alpha,
  724.             const MatExpr_<MatExpr_Op2_<A, double, M, MatOp_DivRS_<Mat> >, M>& a)
  725. { return (M)a.e.a1*(alpha/a.e.a2); }
  726. static inline Mat& operator /= (const Mat& a, const Mat& b)
  727. {
  728.     MatOp_MulDiv_<Mat>::apply( a, b, 1, '/', (Mat&)a );
  729.     return (Mat&)a;
  730. }
  731. template<typename A, typename M>
  732. static inline M& operator /= (const M& a, const MatExpr_<MatExpr_Op2_<A, double,
  733.                               M, MatOp_Scale_<Mat> >, M>& b)
  734. {
  735.     MatOp_MulDiv_<Mat>::apply( a, (M)b.e.a1, 1./b.e.a2, '/', (M&)a );
  736.     return (M&)a;
  737. }
  738. template<typename A, typename M>
  739. static inline M& operator /= (const M& a, const MatExpr_<MatExpr_Op2_<A, double,
  740.                               M, MatOp_DivRS_<Mat> >, M>& b)
  741. {
  742.     MatOp_MulDiv_<Mat>::apply( a, (M)b.e.a1, 1./b.e.a2, '*', (M&)a );
  743.     return (M&)a;
  744. }
  745. // Mat Inversion and solving linear systems
  746. inline MatExpr_<MatExpr_Op2_<Mat, int, Mat, MatOp_Inv_<Mat> >, Mat>
  747. Mat::inv(int method) const
  748. {
  749.     typedef MatExpr_Op2_<Mat, int, Mat, MatOp_Inv_<Mat> > MatExpr_Temp;
  750.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(*this, method));
  751. }
  752. template<typename _Tp> inline
  753. MatExpr_<MatExpr_Op2_<Mat_<_Tp>, int, Mat_<_Tp>, MatOp_Inv_<Mat> >, Mat_<_Tp> >
  754. Mat_<_Tp>::inv(int method) const
  755. {
  756.     typedef MatExpr_Op2_<Mat_<_Tp>, int, Mat_<_Tp>, MatOp_Inv_<Mat> > MatExpr_Temp;
  757.     return MatExpr_<MatExpr_Temp, Mat_<_Tp> >(MatExpr_Temp(*this, method));
  758. }
  759. template<typename A, typename M> static inline
  760. MatExpr_<MatExpr_Op3_<M, M, int, M, MatOp_Solve_<Mat> >, M>
  761. operator * (const MatExpr_<MatExpr_Op2_<A, int, M, MatOp_Inv_<Mat> >, M>& a,
  762.             const M& b)
  763. {
  764.     typedef MatExpr_Op3_<M, M, int, M, MatOp_Solve_<Mat> > MatExpr_Temp;
  765.     return MatExpr_<MatExpr_Temp, M>(MatExpr_Temp((M)a.e.a1, b, a.e.a2));
  766. }
  767. template<typename A, typename B, typename M> static inline
  768. MatExpr_<MatExpr_Op3_<M, M, int, M, MatOp_Solve_<Mat> >, M>
  769. operator * (const MatExpr_<MatExpr_Op2_<A, int, M, MatOp_Inv_<Mat> >, M>& a,
  770.             const MatExpr_<B, M>& b)
  771. { return a*(M)b; }
  772. /////////////////////////////// Initialization ////////////////////////////////////////
  773. inline MatExpr_Initializer Mat::zeros(int rows, int cols, int type)
  774. {
  775.     typedef MatExpr_Op4_<Size, int, Scalar, int, Mat, MatOp_Set_<Mat> > MatExpr_Temp;
  776.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(Size(cols, rows), type, 0, 0));
  777. }
  778. inline MatExpr_Initializer Mat::zeros(Size size, int type)
  779. {
  780.     return zeros(size.height, size.width, type);
  781. }
  782. inline MatExpr_Initializer Mat::ones(int rows, int cols, int type)
  783. {
  784.     typedef MatExpr_Op4_<Size, int, Scalar, int, Mat, MatOp_Set_<Mat> > MatExpr_Temp;
  785.     return MatExpr_<MatExpr_Temp, Mat>(MatExpr_Temp(Size(cols, rows), type, 1, 1));
  786. }
  787. inline MatExpr_Initializer Mat::ones(Size size, int type)
  788. {
  789.     return ones(size.height, size.width, type);
  790. }
  791. inline MatExpr_Initializer Mat::eye(int rows, int cols, int type)
  792. {
  793.     typedef MatExpr_Op4_<Size, int, Scalar, int, Mat, MatOp_Set_<Mat> > MatExpr_Temp;
  794.     return MatExpr_Initializer(MatExpr_Temp(Size(cols, rows), type, 1, 2));
  795. }
  796. inline MatExpr_Initializer Mat::eye(Size size, int type)
  797. {
  798.     return eye(size.height, size.width, type);
  799. }
  800. static inline MatExpr_Initializer operator * (const MatExpr_Initializer& a, double alpha)
  801. {
  802.     typedef MatExpr_Op4_<Size, int, Scalar, int, Mat, MatOp_Set_<Mat> > MatExpr_Temp;
  803.     return MatExpr_Initializer(MatExpr_Temp(a.e.a1, a.e.a2, a.e.a3*alpha, a.e.a4));
  804. }
  805. static inline MatExpr_Initializer operator * (double alpha, MatExpr_Initializer& a)
  806. {
  807.     typedef MatExpr_Op4_<Size, int, Scalar, int, Mat, MatOp_Set_<Mat> > MatExpr_Temp;
  808.     return MatExpr_Initializer(MatExpr_Temp(a.e.a1, a.e.a2, a.e.a3*alpha, a.e.a4));
  809. }
  810. template<typename _Tp> inline MatExpr_Initializer Mat_<_Tp>::zeros(int rows, int cols)
  811. { return Mat::zeros(rows, cols, DataType<_Tp>::type); }
  812. template<typename _Tp> inline MatExpr_Initializer Mat_<_Tp>::zeros(Size size)
  813. { return Mat::zeros(size, DataType<_Tp>::type); }
  814. template<typename _Tp> inline MatExpr_Initializer Mat_<_Tp>::ones(int rows, int cols)
  815. { return Mat::ones(rows, cols, DataType<_Tp>::type); }
  816. template<typename _Tp> inline MatExpr_Initializer Mat_<_Tp>::ones(Size size)
  817. { return Mat::ones(size, DataType<_Tp>::type); }
  818. template<typename _Tp> inline MatExpr_Initializer Mat_<_Tp>::eye(int rows, int cols)
  819. { return Mat::eye(rows, cols, DataType<_Tp>::type); }
  820. template<typename _Tp> inline MatExpr_Initializer Mat_<_Tp>::eye(Size size)
  821. { return Mat::eye(size, DataType<_Tp>::type); }
  822. //////////// Iterators & Comma initializers //////////////////
  823. template<typename _Tp> inline MatConstIterator_<_Tp>::MatConstIterator_()
  824.     : m(0), ptr(0), sliceEnd(0) {}
  825. template<typename _Tp> inline MatConstIterator_<_Tp>::MatConstIterator_(const Mat_<_Tp>* _m) : m(_m)
  826. {
  827.     if( !_m )
  828.         ptr = sliceEnd = 0;
  829.     else
  830.     {
  831.         ptr = (_Tp*)_m->data;
  832.         sliceEnd = ptr + (_m->isContinuous() ? _m->rows*_m->cols : _m->cols);
  833.     }
  834. }
  835. template<typename _Tp> inline MatConstIterator_<_Tp>::
  836.     MatConstIterator_(const Mat_<_Tp>* _m, int _row, int _col) : m(_m)
  837. {
  838.     if( !_m )
  839.         ptr = sliceEnd = 0;
  840.     else
  841.     {
  842.         CV_DbgAssert( (unsigned)_row < _m->rows && (unsigned)_col < _m->cols );
  843.         ptr = (_Tp*)(_m->data + _m->step*_row);
  844.         sliceEnd = _m->isContinuous() ? (_Tp*)_m->data + _m->rows*_m->cols : ptr + _m->cols;
  845.         ptr += _col;
  846.     }
  847. }
  848. template<typename _Tp> inline MatConstIterator_<_Tp>::
  849.     MatConstIterator_(const Mat_<_Tp>* _m, Point _pt) : m(_m)
  850. {
  851.     if( !_m )
  852.         ptr = sliceEnd = 0;
  853.     else
  854.     {
  855.         CV_DbgAssert( (unsigned)_pt.y < (unsigned)_m->rows && (unsigned)_pt.x < (unsigned)_m->cols );
  856.         ptr = (_Tp*)(_m->data + _m->step*_pt.y);
  857.         sliceEnd = _m->isContinuous() ? (_Tp*)_m->data + _m->rows*_m->cols : ptr + _m->cols;
  858.         ptr += _pt.x;
  859.     }
  860. }
  861. template<typename _Tp> inline MatConstIterator_<_Tp>::
  862.     MatConstIterator_(const MatConstIterator_& it)
  863.     : m(it.m), ptr(it.ptr), sliceEnd(it.sliceEnd) {}
  864. template<typename _Tp> inline MatConstIterator_<_Tp>&
  865.     MatConstIterator_<_Tp>::operator = (const MatConstIterator_& it )
  866. {
  867.     m = it.m; ptr = it.ptr; sliceEnd = it.sliceEnd;
  868.     return *this;
  869. }
  870. template<typename _Tp> inline _Tp MatConstIterator_<_Tp>::operator *() const { return *ptr; }
  871. template<typename _Tp> inline MatConstIterator_<_Tp>& MatConstIterator_<_Tp>::operator += (int ofs)
  872. {
  873.     if( !m || ofs == 0 )
  874.         return *this;
  875.     ptr += ofs;
  876.     if( m->isContinuous() )
  877.     {
  878.         if( ptr > sliceEnd )
  879.             ptr = sliceEnd;
  880.         else if( ptr < (_Tp*)m->data )
  881.             ptr = (_Tp*)m->data;
  882.     }
  883.     else if( ptr >= sliceEnd || ptr < sliceEnd - m->cols )
  884.     {
  885.         ptr -= ofs;
  886.         Point pt = pos();
  887.         int cols = m->cols;
  888.         ofs += pt.y*cols + pt.x;
  889.         if( ofs > cols*m->rows )
  890.             ofs = cols*m->rows;
  891.         else if( ofs < 0 )
  892.             ofs = 0;
  893.         pt.y = ofs/cols;
  894.         pt.x = ofs - pt.y*cols;
  895.         ptr = (_Tp*)(m->data + m->step*pt.y);
  896.         sliceEnd = ptr + cols;
  897.         ptr += pt.x;
  898.     }
  899.     return *this;
  900. }
  901. template<typename _Tp> inline MatConstIterator_<_Tp>& MatConstIterator_<_Tp>::operator -= (int ofs)
  902. { return (*this += -ofs); }
  903. template<typename _Tp> inline MatConstIterator_<_Tp>& MatConstIterator_<_Tp>::operator --()
  904. { return (*this += -1); }
  905. template<typename _Tp> inline MatConstIterator_<_Tp> MatConstIterator_<_Tp>::operator --(int)
  906. {
  907.     MatConstIterator_ b = *this;
  908.     *this += -1;
  909.     return b;
  910. }
  911. template<typename _Tp> inline MatConstIterator_<_Tp>& MatConstIterator_<_Tp>::operator ++()
  912. {
  913.     if( m && ++ptr >= sliceEnd )
  914.     {
  915.         --ptr;
  916.         *this += 1;
  917.     }
  918.     return *this;
  919. }
  920. template<typename _Tp> inline MatConstIterator_<_Tp> MatConstIterator_<_Tp>::operator ++(int)
  921. {
  922.     MatConstIterator_ b = *this;
  923.     if( m && ++ptr >= sliceEnd )
  924.     {
  925.         --ptr;
  926.         *this += 1;
  927.     }
  928.     return b;
  929. }
  930. template<typename _Tp> inline Point MatConstIterator_<_Tp>::pos() const
  931. {
  932.     if( !m )
  933.         return Point();
  934.     if( m->isContinuous() )
  935.     {
  936.         int ofs = ptr - (_Tp*)m->data, y = ofs / m->cols, x = ofs - y*m->cols;
  937.         return Point(x,y);
  938.     }
  939.     else
  940.     {
  941.         int stepT = m->stepT(), y = (ptr - (_Tp*)m->data)/stepT, x = (ptr - (_Tp*)m->data) - y*stepT;
  942.         return Point(x,y);
  943.     }
  944. }
  945. template<typename _Tp> inline MatIterator_<_Tp>::MatIterator_() : MatConstIterator_<_Tp>() {}
  946. template<typename _Tp> inline MatIterator_<_Tp>::MatIterator_(Mat_<_Tp>* _m)
  947.     : MatConstIterator_<_Tp>(_m) {}
  948. template<typename _Tp> inline MatIterator_<_Tp>::MatIterator_(Mat_<_Tp>* _m, int _row, int _col)
  949.     : MatConstIterator_<_Tp>(_m, _row, _col) {}
  950. template<typename _Tp> inline MatIterator_<_Tp>::MatIterator_(const Mat_<_Tp>* _m, Point _pt)
  951.     : MatConstIterator_<_Tp>(_m, _pt) {}
  952. template<typename _Tp> inline MatIterator_<_Tp>::MatIterator_(const MatIterator_& it)
  953.     : MatConstIterator_<_Tp>(it) {}
  954. template<typename _Tp> inline MatIterator_<_Tp>& MatIterator_<_Tp>::operator = (const MatIterator_<_Tp>& it )
  955. {
  956.     this->m = it.m; this->ptr = it.ptr; this->sliceEnd = it.sliceEnd;
  957.     return *this;
  958. }
  959. template<typename _Tp> inline _Tp& MatIterator_<_Tp>::operator *() const { return *(this->ptr); }
  960. template<typename _Tp> inline MatIterator_<_Tp>& MatIterator_<_Tp>::operator += (int ofs)
  961. {
  962.     MatConstIterator_<_Tp>::operator += (ofs);
  963.     return *this;
  964. }
  965. template<typename _Tp> inline MatIterator_<_Tp>& MatIterator_<_Tp>::operator -= (int ofs)
  966. {
  967.     MatConstIterator_<_Tp>::operator += (-ofs);
  968.     return *this;
  969. }
  970. template<typename _Tp> inline MatIterator_<_Tp>& MatIterator_<_Tp>::operator --()
  971. {
  972.     MatConstIterator_<_Tp>::operator += (-1);
  973.     return *this;
  974. }
  975. template<typename _Tp> inline MatIterator_<_Tp> MatIterator_<_Tp>::operator --(int)
  976. {
  977.     MatIterator_ b = *this;
  978.     MatConstIterator_<_Tp>::operator += (-1);
  979.     return b;
  980. }
  981. template<typename _Tp> inline MatIterator_<_Tp>& MatIterator_<_Tp>::operator ++()
  982. {
  983.     if( this->m && ++this->ptr >= this->sliceEnd )
  984.     {
  985.         --this->ptr;
  986.         MatConstIterator_<_Tp>::operator += (1);
  987.     }
  988.     return *this;
  989. }
  990. template<typename _Tp> inline MatIterator_<_Tp> MatIterator_<_Tp>::operator ++(int)
  991. {
  992.     MatIterator_ b = *this;
  993.     if( this->m && ++this->ptr >= this->sliceEnd )
  994.     {
  995.         --this->ptr;
  996.         MatConstIterator_<_Tp>::operator += (1);
  997.     }
  998.     return b;
  999. }
  1000. template<typename _Tp> static inline bool
  1001. operator == (const MatConstIterator_<_Tp>& a, const MatConstIterator_<_Tp>& b)
  1002. { return a.m == b.m && a.ptr == b.ptr; }
  1003. template<typename _Tp> static inline bool
  1004. operator != (const MatConstIterator_<_Tp>& a, const MatConstIterator_<_Tp>& b)
  1005. { return !(a == b); }
  1006. template<typename _Tp> static inline bool
  1007. operator < (const MatConstIterator_<_Tp>& a, const MatConstIterator_<_Tp>& b)
  1008. { return a.ptr < b.ptr; }
  1009. template<typename _Tp> static inline bool
  1010. operator > (const MatConstIterator_<_Tp>& a, const MatConstIterator_<_Tp>& b)
  1011. { return a.ptr > b.ptr; }
  1012. template<typename _Tp> static inline bool
  1013. operator <= (const MatConstIterator_<_Tp>& a, const MatConstIterator_<_Tp>& b)
  1014. { return a.ptr <= b.ptr; }
  1015. template<typename _Tp> static inline bool
  1016. operator >= (const MatConstIterator_<_Tp>& a, const MatConstIterator_<_Tp>& b)
  1017. { return a.ptr >= b.ptr; }
  1018. template<typename _Tp> static inline int
  1019. operator - (const MatConstIterator_<_Tp>& b, const MatConstIterator_<_Tp>& a)
  1020. {
  1021.     if( a.m != b.m )
  1022.         return INT_MAX;
  1023.     if( a.sliceEnd == b.sliceEnd )
  1024.         return b.ptr - a.ptr;
  1025.     {
  1026.         Point ap = a.pos(), bp = b.pos();
  1027.         if( bp.y > ap.y )
  1028.             return (bp.y - ap.y - 1)*a.m->cols + (a.m->cols - ap.x) + bp.x;
  1029.         if( bp.y < ap.y )
  1030.             return -((ap.y - bp.y - 1)*a.m->cols + (a.m->cols - bp.x) + ap.x);
  1031.         return bp.x - ap.x;
  1032.     }
  1033. }
  1034. template<typename _Tp> static inline MatConstIterator_<_Tp>
  1035. operator + (const MatConstIterator_<_Tp>& a, int ofs)
  1036. { MatConstIterator_<_Tp> b = a; return b += ofs; }
  1037. template<typename _Tp> static inline MatConstIterator_<_Tp>
  1038. operator + (int ofs, const MatConstIterator_<_Tp>& a)
  1039. { MatConstIterator_<_Tp> b = a; return b += ofs; }
  1040. template<typename _Tp> static inline MatConstIterator_<_Tp>
  1041. operator - (const MatConstIterator_<_Tp>& a, int ofs)
  1042. { MatConstIterator_<_Tp> b = a; return b += -ofs; }
  1043. template<typename _Tp> inline _Tp MatConstIterator_<_Tp>::operator [](int i) const
  1044. { return *(*this + i); }
  1045. template<typename _Tp> static inline MatIterator_<_Tp>
  1046. operator + (const MatIterator_<_Tp>& a, int ofs)
  1047. { MatIterator_<_Tp> b = a; return b += ofs; }
  1048. template<typename _Tp> static inline MatIterator_<_Tp>
  1049. operator + (int ofs, const MatIterator_<_Tp>& a)
  1050. { MatIterator_<_Tp> b = a; return b += ofs; }
  1051. template<typename _Tp> static inline MatIterator_<_Tp>
  1052. operator - (const MatIterator_<_Tp>& a, int ofs)
  1053. { MatIterator_<_Tp> b = a; return b += -ofs; }
  1054. template<typename _Tp> inline _Tp& MatIterator_<_Tp>::operator [](int i) const
  1055. { return *(*this + i); }
  1056. template<typename _Tp> inline MatConstIterator_<_Tp> Mat_<_Tp>::begin() const
  1057. { return Mat::begin<_Tp>(); }
  1058. template<typename _Tp> inline MatConstIterator_<_Tp> Mat_<_Tp>::end() const
  1059. { return Mat::end<_Tp>(); }
  1060. template<typename _Tp> inline MatIterator_<_Tp> Mat_<_Tp>::begin()
  1061. { return Mat::begin<_Tp>(); }
  1062. template<typename _Tp> inline MatIterator_<_Tp> Mat_<_Tp>::end()
  1063. { return Mat::end<_Tp>(); }
  1064. template<typename _Tp> class CV_EXPORTS MatOp_Iter_
  1065. {
  1066. public:    
  1067.     MatOp_Iter_() {}
  1068.     static void apply(const MatIterator_<_Tp>& a, Mat& c, int type=-1)
  1069.     {
  1070.         if( type < 0 )
  1071.             c = *a.m;
  1072.         else
  1073.             a.m->convertTo(c, type);
  1074.     }
  1075. };
  1076. template<typename _Tp> inline MatCommaInitializer_<_Tp>::MatCommaInitializer_(Mat_<_Tp>* _m) :
  1077.     MatExpr_<MatExpr_Op1_<MatIterator_<_Tp>, Mat_<_Tp>,
  1078.         MatOp_Iter_<_Tp> >, Mat_<_Tp> >(MatIterator_<_Tp>(_m)) {}
  1079. template<typename _Tp> template<typename T2> inline MatCommaInitializer_<_Tp>&
  1080. MatCommaInitializer_<_Tp>::operator , (T2 v)
  1081. {
  1082.     CV_DbgAssert( this->e.a1 < this->e.a1.m->end() );
  1083.     *this->e.a1 = _Tp(v); ++this->e.a1;
  1084.     return *this;
  1085. }
  1086. template<typename _Tp> inline MatCommaInitializer_<_Tp>::operator Mat_<_Tp>() const
  1087. {
  1088.     CV_DbgAssert( this->e.a1 == this->e.a1.m->end() );
  1089.     return *this->e.a1.m;
  1090. }
  1091. template<typename _Tp> inline Mat_<_Tp> MatCommaInitializer_<_Tp>::operator *() const
  1092. {
  1093.     CV_DbgAssert( this->e.a1 == this->e.a1.m->end() );
  1094.     return *this->e.a1.m;
  1095. }
  1096. template<typename _Tp> inline void
  1097. MatCommaInitializer_<_Tp>::assignTo(Mat& m, int type) const
  1098. {
  1099.     Mat_<_Tp>(*this).assignTo(m, type);
  1100. }
  1101. template<typename _Tp, typename T2> static inline MatCommaInitializer_<_Tp>
  1102. operator << (const Mat_<_Tp>& m, T2 val)
  1103. {
  1104.     MatCommaInitializer_<_Tp> commaInitializer((Mat_<_Tp>*)&m);
  1105.     return (commaInitializer, val);
  1106. }
  1107. //////////////////////////////// MatND ////////////////////////////////
  1108. inline MatND::MatND()
  1109.  : flags(MAGIC_VAL), dims(0), refcount(0), data(0), datastart(0), dataend(0)
  1110. {
  1111. }
  1112. inline MatND::MatND(int _dims, const int* _sizes, int _type)
  1113.  : flags(MAGIC_VAL), dims(0), refcount(0), data(0), datastart(0), dataend(0)
  1114. {
  1115.     create(_dims, _sizes, _type);
  1116. }
  1117. inline MatND::MatND(int _dims, const int* _sizes, int _type, const Scalar& _s)
  1118.  : flags(MAGIC_VAL), dims(0), refcount(0), data(0), datastart(0), dataend(0)
  1119. {
  1120.     create(_dims, _sizes, _type);
  1121.     *this = _s;
  1122. }
  1123. inline MatND::MatND(const MatND& m)
  1124.  : flags(m.flags), dims(m.dims), refcount(m.refcount),
  1125.  data(m.data), datastart(m.datastart), dataend(m.dataend)
  1126. {
  1127.     int i, d = dims;
  1128.     for( i = 0; i < d; i++ )
  1129.     {
  1130.         size[i] = m.size[i];
  1131.         step[i] = m.step[i];
  1132.     }
  1133.     if( refcount )
  1134.         CV_XADD(refcount, 1);
  1135. }
  1136. inline MatND::MatND(const CvMatND* m, bool copyData)
  1137.   : flags(MAGIC_VAL|(m->type & (CV_MAT_TYPE_MASK|CV_MAT_CONT_FLAG))),
  1138.   dims(m->dims), refcount(0), data(m->data.ptr)
  1139. {
  1140.     int i, d = dims;
  1141.     for( i = 0; i < d; i++ )
  1142.     {
  1143.         size[i] = m->dim[i].size;
  1144.         step[i] = m->dim[i].step;
  1145.     }
  1146.     datastart = data;
  1147.     dataend = datastart + size[0]*step[0];
  1148.     if( copyData )
  1149.     {
  1150.         MatND temp(*this);
  1151.         temp.copyTo(*this);
  1152.     }
  1153. }
  1154. inline MatND::~MatND() { release(); }
  1155. inline MatND& MatND::operator = (const MatND& m)
  1156. {
  1157.     if( this != &m )
  1158.     {
  1159.         if( m.refcount )
  1160.             CV_XADD(m.refcount, 1);
  1161.         release();
  1162.         flags = m.flags;
  1163.         dims = m.dims;
  1164.         data = m.data;
  1165.         datastart = m.datastart;
  1166.         dataend = m.dataend;
  1167.         refcount = m.refcount;
  1168.         int i, d = dims;
  1169.         for( i = 0; i < d; i++ )
  1170.         {
  1171.             size[i] = m.size[i];
  1172.             step[i] = m.step[i];
  1173.         }
  1174.     }
  1175.     return *this;
  1176. }
  1177. inline MatND MatND::clone() const
  1178. {
  1179.     MatND temp;
  1180.     this->copyTo(temp);
  1181.     return temp;
  1182. }
  1183. inline MatND MatND::operator()(const Range* ranges) const
  1184. {
  1185.     return MatND(*this, ranges);
  1186. }
  1187. inline void MatND::assignTo( MatND& m, int type ) const
  1188. {
  1189.     if( type < 0 )
  1190.         m = *this;
  1191.     else
  1192.         convertTo(m, type);
  1193. }
  1194. inline void MatND::addref()
  1195. {
  1196.     if( refcount ) CV_XADD(refcount, 1);
  1197. }
  1198. inline void MatND::release()
  1199. {
  1200.     if( refcount && CV_XADD(refcount, -1) == 1 )
  1201.         fastFree(datastart);
  1202.     dims = 0;
  1203.     data = datastart = dataend = 0;
  1204.     refcount = 0;
  1205. }
  1206. inline bool MatND::isContinuous() const { return (flags & CONTINUOUS_FLAG) != 0; }
  1207. inline size_t MatND::elemSize() const { return getElemSize(flags); }
  1208. inline size_t MatND::elemSize1() const { return CV_ELEM_SIZE1(flags); }
  1209. inline int MatND::type() const { return CV_MAT_TYPE(flags); }
  1210. inline int MatND::depth() const { return CV_MAT_DEPTH(flags); }
  1211. inline int MatND::channels() const { return CV_MAT_CN(flags); }
  1212. inline size_t MatND::step1(int i) const
  1213. { CV_DbgAssert((unsigned)i < (unsigned)dims); return step[i]/elemSize1(); }
  1214. inline uchar* MatND::ptr(int i0)
  1215. {
  1216.     CV_DbgAssert( dims == 1 && data &&
  1217.         (unsigned)i0 < (unsigned)size[0] );
  1218.     return data + i0*step[0];
  1219. }
  1220. inline const uchar* MatND::ptr(int i0) const
  1221. {
  1222.     CV_DbgAssert( dims == 1 && data &&
  1223.         (unsigned)i0 < (unsigned)size[0] );
  1224.     return data + i0*step[0];
  1225. }
  1226. inline uchar* MatND::ptr(int i0, int i1)
  1227. {
  1228.     CV_DbgAssert( dims == 2 && data &&
  1229.         (unsigned)i0 < (unsigned)size[0] &&
  1230.         (unsigned)i1 < (unsigned)size[1] );
  1231.     return data + i0*step[0] + i1*step[1];
  1232. }
  1233. inline const uchar* MatND::ptr(int i0, int i1) const
  1234. {
  1235.     CV_DbgAssert( dims == 2 && data &&
  1236.         (unsigned)i0 < (unsigned)size[0] &&
  1237.         (unsigned)i1 < (unsigned)size[1] );
  1238.     return data + i0*step[0] + i1*step[1];
  1239. }
  1240. inline uchar* MatND::ptr(int i0, int i1, int i2)
  1241. {
  1242.     CV_DbgAssert( dims == 3 && data &&
  1243.         (unsigned)i0 < (unsigned)size[0] &&
  1244.         (unsigned)i1 < (unsigned)size[1] &&
  1245.         (unsigned)i2 < (unsigned)size[2] );
  1246.     return data + i0*step[0] + i1*step[1] + i2*step[2];
  1247. }
  1248. inline const uchar* MatND::ptr(int i0, int i1, int i2) const
  1249. {
  1250.     CV_DbgAssert( dims == 3 && data &&
  1251.         (unsigned)i0 < (unsigned)size[0] &&
  1252.         (unsigned)i1 < (unsigned)size[1] &&
  1253.         (unsigned)i2 < (unsigned)size[2] );
  1254.     return data + i0*step[0] + i1*step[1] + i2*step[2];
  1255. }
  1256. inline uchar* MatND::ptr(const int* idx)
  1257. {
  1258.     int i, d = dims;
  1259.     uchar* p = data;
  1260.     CV_DbgAssert( data );
  1261.     for( i = 0; i < d; i++ )
  1262.     {
  1263.         CV_DbgAssert( (unsigned)idx[i] < (unsigned)size[i] );
  1264.         p += idx[i]*step[i];
  1265.     }
  1266.     return p;
  1267. }
  1268. inline const uchar* MatND::ptr(const int* idx) const
  1269. {
  1270.     int i, d = dims;
  1271.     uchar* p = data;
  1272.     CV_DbgAssert( data );
  1273.     for( i = 0; i < d; i++ )
  1274.     {
  1275.         CV_DbgAssert( (unsigned)idx[i] < (unsigned)size[i] );
  1276.         p += idx[i]*step[i];
  1277.     }
  1278.     return p;
  1279. }
  1280. template<typename _Tp> inline _Tp& MatND::at(int i0)
  1281. { return *(_Tp*)ptr(i0); }
  1282. template<typename _Tp> inline const _Tp& MatND::at(int i0) const
  1283. { return *(const _Tp*)ptr(i0); }
  1284. template<typename _Tp> inline _Tp& MatND::at(int i0, int i1)
  1285. { return *(_Tp*)ptr(i0, i1); }
  1286. template<typename _Tp> inline const _Tp& MatND::at(int i0, int i1) const
  1287. { return *(const _Tp*)ptr(i0, i1); }
  1288. template<typename _Tp> inline _Tp& MatND::at(int i0, int i1, int i2)
  1289. { return *(_Tp*)ptr(i0, i1, i2); }
  1290. template<typename _Tp> inline const _Tp& MatND::at(int i0, int i1, int i2) const
  1291. { return *(const _Tp*)ptr(i0, i1, i2); }
  1292. template<typename _Tp> inline _Tp& MatND::at(const int* idx)
  1293. { return *(_Tp*)ptr(idx); }
  1294. template<typename _Tp> inline const _Tp& MatND::at(const int* idx) const
  1295. { return *(const _Tp*)ptr(idx); }
  1296. inline NAryMatNDIterator::NAryMatNDIterator()
  1297. {
  1298. }
  1299. inline void subtract(const MatND& a, const Scalar& s, MatND& c, const MatND& mask=MatND())
  1300. {
  1301.     add(a, -s, c, mask);
  1302. }
  1303. template<typename _Tp> inline MatND_<_Tp>::MatND_()
  1304. {
  1305.     flags = MAGIC_VAL | DataType<_Tp>::type;
  1306. }
  1307. template<typename _Tp> inline MatND_<_Tp>::MatND_(int _dims, const int* _sizes)
  1308. : MatND(_dims, _sizes, DataType<_Tp>::type)
  1309. {
  1310. }
  1311. template<typename _Tp> inline MatND_<_Tp>::MatND_(int _dims, const int* _sizes, const _Tp& _s)
  1312. : MatND(_dims, _sizes, DataType<_Tp>::type, Scalar(_s))
  1313. {
  1314. }
  1315. template<typename _Tp> inline MatND_<_Tp>::MatND_(const MatND& m)
  1316. {
  1317.     if( m.type() == DataType<_Tp>::type )
  1318.         *this = (const MatND_<_Tp>&)m;
  1319.     else
  1320.         m.convertTo(this, DataType<_Tp>::type);
  1321. }
  1322. template<typename _Tp> inline MatND_<_Tp>::MatND_(const MatND_<_Tp>& m) : MatND(m)
  1323. {
  1324. }
  1325. template<typename _Tp> inline MatND_<_Tp>::MatND_(const MatND_<_Tp>& m, const Range* ranges)
  1326. : MatND(m, ranges)
  1327. {
  1328. }
  1329. template<typename _Tp> inline MatND_<_Tp>::MatND_(const CvMatND* m, bool copyData)
  1330. {
  1331.     *this = MatND(m, copyData || CV_MAT_TYPE(m->type) != DataType<_Tp>::type);
  1332. }
  1333. template<typename _Tp> inline MatND_<_Tp>& MatND_<_Tp>::operator = (const MatND& m)
  1334. {
  1335.     if( DataType<_Tp>::type == m.type() )
  1336.     {
  1337.         Mat::operator = (m);
  1338.         return *this;
  1339.     }
  1340.     if( DataType<_Tp>::depth == m.depth() )
  1341.     {
  1342.         return (*this = m.reshape(DataType<_Tp>::channels));
  1343.     }
  1344.     CV_DbgAssert(DataType<_Tp>::channels == m.channels());
  1345.     m.convertTo(*this, DataType<_Tp>::type);
  1346.     return *this;
  1347. }
  1348. template<typename _Tp> inline MatND_<_Tp>& MatND_<_Tp>::operator = (const MatND_<_Tp>& m)
  1349. {
  1350.     return ((MatND&)*this = m);
  1351. }
  1352. template<typename _Tp> inline MatND_<_Tp>& MatND_<_Tp>::operator = (const _Tp& s)
  1353. {
  1354.     return (MatND&)*this = Scalar(s);
  1355. }
  1356. template<typename _Tp> inline void MatND_<_Tp>::create(int _dims, const int* _sizes)
  1357. {
  1358.     MatND::create(_dims, _sizes, DataType<_Tp>::type);
  1359. }
  1360. template<typename _Tp> template<typename _Tp2> inline MatND_<_Tp>::operator MatND_<_Tp2>() const
  1361. {
  1362.     return MatND_<_Tp2>((const MatND&)*this);
  1363. }
  1364. template<typename _Tp> inline MatND_<_Tp> MatND_<_Tp>::clone() const
  1365. {
  1366.     MatND_<_Tp> temp;
  1367.     this->copyTo(temp);
  1368.     return temp;
  1369. }
  1370. template<typename _Tp> inline MatND_<_Tp>
  1371. MatND_<_Tp>::operator()(const Range* ranges) const
  1372. { return MatND_<_Tp>(*this, ranges); }
  1373. template<typename _Tp> inline size_t MatND_<_Tp>::elemSize() const
  1374. { return CV_ELEM_SIZE(DataType<_Tp>::type); }
  1375. template<typename _Tp> inline size_t MatND_<_Tp>::elemSize1() const
  1376. { return CV_ELEM_SIZE1(DataType<_Tp>::type); }
  1377. template<typename _Tp> inline int MatND_<_Tp>::type() const
  1378. { return DataType<_Tp>::type; }
  1379. template<typename _Tp> inline int MatND_<_Tp>::depth() const
  1380. { return DataType<_Tp>::depth; }
  1381. template<typename _Tp> inline int MatND_<_Tp>::channels() const
  1382. { return DataType<_Tp>::channels; }
  1383. template<typename _Tp> inline size_t MatND_<_Tp>::stepT(int i) const
  1384. {
  1385.     CV_DbgAssert( (unsigned)i < (unsigned)dims );
  1386.     return step[i]/elemSize();
  1387. }
  1388. template<typename _Tp> inline size_t MatND_<_Tp>::step1(int i) const
  1389. {
  1390.     CV_DbgAssert( (unsigned)i < (unsigned)dims );
  1391.     return step[i]/elemSize1();
  1392. }
  1393. template<typename _Tp> inline _Tp& MatND_<_Tp>::operator ()(const int* idx)
  1394. {
  1395.     uchar* ptr = data;
  1396.     int i, d = dims;
  1397.     for( i = 0; i < d; i++ )
  1398.     {
  1399.         int ii = idx[i];
  1400.         CV_DbgAssert( (unsigned)ii < (unsigned)size[i] );
  1401.         ptr += ii*step[i];
  1402.     }
  1403.     return *(_Tp*)ptr;
  1404. }
  1405. template<typename _Tp> inline const _Tp& MatND_<_Tp>::operator ()(const int* idx) const
  1406. {
  1407.     const uchar* ptr = data;
  1408.     int i, d = dims;
  1409.     for( i = 0; i < d; i++ )
  1410.     {
  1411.         int ii = idx[i];
  1412.         CV_DbgAssert( (unsigned)ii < (unsigned)size[i] );
  1413.         ptr += ii*step[i];
  1414.     }
  1415.     return *(const _Tp*)ptr;
  1416. }
  1417. template<typename _Tp> inline _Tp& MatND_<_Tp>::operator ()(int i0)
  1418. {
  1419.     CV_DbgAssert( dims == 1 &&
  1420.                  (unsigned)i0 < (unsigned)size[0] );
  1421.     
  1422.     return *(_Tp*)(data + i0*step[0]);
  1423. }
  1424. template<typename _Tp> inline const _Tp& MatND_<_Tp>::operator ()(int i0) const
  1425. {
  1426.     CV_DbgAssert( dims == 1 &&
  1427.                  (unsigned)i0 < (unsigned)size[0] );
  1428.     
  1429.     return *(const _Tp*)(data + i0*step[0]);
  1430. }
  1431.     
  1432.     
  1433. template<typename _Tp> inline _Tp& MatND_<_Tp>::operator ()(int i0, int i1)
  1434. {
  1435.     CV_DbgAssert( dims == 2 &&
  1436.                  (unsigned)i0 < (unsigned)size[0] &&
  1437.                  (unsigned)i1 < (unsigned)size[1] );
  1438.     
  1439.     return *(_Tp*)(data + i0*step[0] + i1*step[1]);
  1440. }
  1441. template<typename _Tp> inline const _Tp& MatND_<_Tp>::operator ()(int i0, int i1) const
  1442. {
  1443.     CV_DbgAssert( dims == 2 &&
  1444.                  (unsigned)i0 < (unsigned)size[0] &&
  1445.                  (unsigned)i1 < (unsigned)size[1] );
  1446.     
  1447.     return *(const _Tp*)(data + i0*step[0] + i1*step[1]);
  1448. }
  1449.     
  1450.     
  1451. template<typename _Tp> inline _Tp& MatND_<_Tp>::operator ()(int i0, int i1, int i2)
  1452. {
  1453.     CV_DbgAssert( dims == 3 &&
  1454.         (unsigned)i0 < (unsigned)size[0] &&
  1455.         (unsigned)i1 < (unsigned)size[1] &&
  1456.         (unsigned)i2 < (unsigned)size[2] );
  1457.     return *(_Tp*)(data + i0*step[0] + i1*step[1] + i2*step[2]);
  1458. }
  1459. template<typename _Tp> inline const _Tp& MatND_<_Tp>::operator ()(int i0, int i1, int i2) const
  1460. {
  1461.     CV_DbgAssert( dims == 3 &&
  1462.         (unsigned)i0 < (unsigned)size[0] &&
  1463.         (unsigned)i1 < (unsigned)size[1] &&
  1464.         (unsigned)i2 < (unsigned)size[2] );
  1465.     return *(const _Tp*)(data + i0*step[0] + i1*step[1] + i2*step[2]);
  1466. }
  1467.     
  1468. static inline void merge(const vector<MatND>& mv, MatND& dst)
  1469. {
  1470.     merge(&mv[0], mv.size(), dst);
  1471. }
  1472.     
  1473. static inline void split(const MatND& m, vector<MatND>& mv)
  1474. {
  1475.     mv.resize(m.channels());
  1476.     if(m.channels() > 0)
  1477.         split(m, &mv[0]);
  1478. }
  1479. static inline void mixChannels(const vector<MatND>& src, vector<MatND>& dst,
  1480.                                const int* fromTo, int npairs)
  1481. {
  1482.     mixChannels(&src[0], (int)src.size(), &dst[0], (int)dst.size(), fromTo, npairs);
  1483. }   
  1484. //////////////////////////////// SparseMat ////////////////////////////////
  1485. inline SparseMat::SparseMat()
  1486. : flags(MAGIC_VAL), hdr(0)
  1487. {
  1488. }
  1489. inline SparseMat::SparseMat(int _dims, const int* _sizes, int _type)
  1490. : flags(MAGIC_VAL), hdr(0)
  1491. {
  1492.     create(_dims, _sizes, _type);
  1493. }
  1494. inline SparseMat::SparseMat(const SparseMat& m)
  1495. : flags(m.flags), hdr(m.hdr)
  1496. {
  1497.     addref();
  1498. }
  1499. inline SparseMat::~SparseMat()
  1500. {
  1501.     release();
  1502. }
  1503. inline SparseMat& SparseMat::operator = (const SparseMat& m)
  1504. {
  1505.     if( this != &m )
  1506.     {
  1507.         if( m.hdr )
  1508.             CV_XADD(&m.hdr->refcount, 1);
  1509.         release();
  1510.         flags = m.flags;
  1511.         hdr = m.hdr;
  1512.     }
  1513.     return *this;
  1514. }
  1515. inline SparseMat& SparseMat::operator = (const Mat& m)
  1516. { return (*this = SparseMat(m)); }
  1517. inline SparseMat& SparseMat::operator = (const MatND& m)
  1518. { return (*this = SparseMat(m)); }
  1519. inline SparseMat SparseMat::clone() const
  1520. {
  1521.     SparseMat temp;
  1522.     this->copyTo(temp);
  1523.     return temp;
  1524. }
  1525. inline void SparseMat::assignTo( SparseMat& m, int type ) const
  1526. {
  1527.     if( type < 0 )
  1528.         m = *this;
  1529.     else
  1530.         convertTo(m, type);
  1531. }
  1532. inline void SparseMat::addref()
  1533. { if( hdr ) CV_XADD(&hdr->refcount, 1); }
  1534. inline void SparseMat::release()
  1535. {
  1536.     if( hdr && CV_XADD(&hdr->refcount, -1) == 1 )
  1537.         delete hdr;
  1538.     hdr = 0;
  1539. }
  1540. inline size_t SparseMat::elemSize() const
  1541. { return CV_ELEM_SIZE(flags); }
  1542. inline size_t SparseMat::elemSize1() const
  1543. { return CV_ELEM_SIZE1(flags); }
  1544. inline int SparseMat::type() const
  1545. { return CV_MAT_TYPE(flags); }
  1546. inline int SparseMat::depth() const
  1547. { return CV_MAT_DEPTH(flags); }
  1548. inline int SparseMat::channels() const
  1549. { return CV_MAT_CN(flags); }
  1550. inline const int* SparseMat::size() const
  1551. {
  1552.     return hdr ? hdr->size : 0;
  1553. }
  1554. inline int SparseMat::size(int i) const
  1555. {
  1556.     if( hdr )
  1557.     {
  1558.         CV_DbgAssert((unsigned)i < (unsigned)hdr->dims);
  1559.         return hdr->size[i];
  1560.     }
  1561.     return 0;
  1562. }
  1563. inline int SparseMat::dims() const
  1564. {
  1565.     return hdr ? hdr->dims : 0;
  1566. }
  1567. inline size_t SparseMat::nzcount() const
  1568. {
  1569.     return hdr ? hdr->nodeCount : 0;
  1570. }
  1571. inline size_t SparseMat::hash(int i0) const
  1572. {
  1573.     return (size_t)i0;
  1574. }
  1575. inline size_t SparseMat::hash(int i0, int i1) const
  1576. {
  1577.     return (size_t)(unsigned)i0*HASH_SCALE + (unsigned)i1;
  1578. }
  1579. inline size_t SparseMat::hash(int i0, int i1, int i2) const
  1580. {
  1581.     return ((size_t)(unsigned)i0*HASH_SCALE + (unsigned)i1)*HASH_SCALE + (unsigned)i2;
  1582. }
  1583. inline size_t SparseMat::hash(const int* idx) const
  1584. {
  1585.     size_t h = (unsigned)idx[0];
  1586.     if( !hdr )
  1587.         return 0;
  1588.     int i, d = hdr->dims;
  1589.     for( i = 1; i < d; i++ )
  1590.         h = h*HASH_SCALE + (unsigned)idx[i];
  1591.     return h;
  1592. }
  1593. template<typename _Tp> inline _Tp& SparseMat::ref(int i0, size_t* hashval)
  1594. { return *(_Tp*)((SparseMat*)this)->ptr(i0, true, hashval); }
  1595.     
  1596. template<typename _Tp> inline _Tp& SparseMat::ref(int i0, int i1, size_t* hashval)
  1597. { return *(_Tp*)((SparseMat*)this)->ptr(i0, i1, true, hashval); }
  1598. template<typename _Tp> inline _Tp& SparseMat::ref(int i0, int i1, int i2, size_t* hashval)
  1599. { return *(_Tp*)((SparseMat*)this)->ptr(i0, i1, i2, true, hashval); }
  1600. template<typename _Tp> inline _Tp& SparseMat::ref(const int* idx, size_t* hashval)
  1601. { return *(_Tp*)((SparseMat*)this)->ptr(idx, true, hashval); }
  1602. template<typename _Tp> inline _Tp SparseMat::value(int i0, size_t* hashval) const
  1603. {
  1604.     const _Tp* p = (const _Tp*)((SparseMat*)this)->ptr(i0, false, hashval);
  1605.     return p ? *p : _Tp();
  1606. }    
  1607.     
  1608. template<typename _Tp> inline _Tp SparseMat::value(int i0, int i1, size_t* hashval) const
  1609. {
  1610.     const _Tp* p = (const _Tp*)((SparseMat*)this)->ptr(i0, i1, false, hashval);
  1611.     return p ? *p : _Tp();
  1612. }
  1613. template<typename _Tp> inline _Tp SparseMat::value(int i0, int i1, int i2, size_t* hashval) const
  1614. {
  1615.     const _Tp* p = (const _Tp*)((SparseMat*)this)->ptr(i0, i1, i2, false, hashval);
  1616.     return p ? *p : _Tp();
  1617. }
  1618. template<typename _Tp> inline _Tp SparseMat::value(const int* idx, size_t* hashval) const
  1619. {
  1620.     const _Tp* p = (const _Tp*)((SparseMat*)this)->ptr(idx, false, hashval);
  1621.     return p ? *p : _Tp();
  1622. }
  1623. template<typename _Tp> inline const _Tp* SparseMat::find(int i0, size_t* hashval) const
  1624. { return (const _Tp*)((SparseMat*)this)->ptr(i0, true, hashval); }
  1625.     
  1626. template<typename _Tp> inline const _Tp* SparseMat::find(int i0, int i1, size_t* hashval) const
  1627. { return (const _Tp*)((SparseMat*)this)->ptr(i0, i1, true, hashval); }
  1628. template<typename _Tp> inline const _Tp* SparseMat::find(int i0, int i1, int i2, size_t* hashval) const
  1629. { return (const _Tp*)((SparseMat*)this)->ptr(i0, i1, i2, true, hashval); }
  1630. template<typename _Tp> inline const _Tp* SparseMat::find(const int* idx, size_t* hashval) const
  1631. { return (const _Tp*)((SparseMat*)this)->ptr(idx, true, hashval); }
  1632. template<typename _Tp> inline _Tp& SparseMat::value(Node* n)
  1633. { return *(_Tp*)((uchar*)n + hdr->valueOffset); }
  1634. template<typename _Tp> inline const _Tp& SparseMat::value(const Node* n) const
  1635. { return *(const _Tp*)((const uchar*)n + hdr->valueOffset); }
  1636. inline SparseMat::Node* SparseMat::node(size_t nidx)
  1637. { return (Node*)&hdr->pool[nidx]; }
  1638. inline const SparseMat::Node* SparseMat::node(size_t nidx) const
  1639. { return (const Node*)&hdr->pool[nidx]; }
  1640. inline SparseMatIterator SparseMat::begin()
  1641. { return SparseMatIterator(this); }
  1642. inline SparseMatConstIterator SparseMat::begin() const
  1643. { return SparseMatConstIterator(this); }
  1644. inline SparseMatIterator SparseMat::end()
  1645. { SparseMatIterator it(this); it.seekEnd(); return it; }
  1646.     
  1647. inline SparseMatConstIterator SparseMat::end() const
  1648. { SparseMatConstIterator it(this); it.seekEnd(); return it; }
  1649.     
  1650. template<typename _Tp> inline SparseMatIterator_<_Tp> SparseMat::begin()
  1651. { return SparseMatIterator_<_Tp>(this); }
  1652.     
  1653. template<typename _Tp> inline SparseMatConstIterator_<_Tp> SparseMat::begin() const
  1654. { return SparseMatConstIterator_<_Tp>(this); }
  1655.     
  1656. template<typename _Tp> inline SparseMatIterator_<_Tp> SparseMat::end()
  1657. { SparseMatIterator_<_Tp> it(this); it.seekEnd(); return it; }
  1658. template<typename _Tp> inline SparseMatConstIterator_<_Tp> SparseMat::end() const
  1659. { SparseMatConstIterator_<_Tp> it(this); it.seekEnd(); return it; }
  1660.     
  1661.     
  1662. inline SparseMatConstIterator::SparseMatConstIterator()
  1663. : m(0), hashidx(0), ptr(0)
  1664. {
  1665. }
  1666. inline SparseMatConstIterator::SparseMatConstIterator(const SparseMatConstIterator& it)
  1667. : m(it.m), hashidx(it.hashidx), ptr(it.ptr)
  1668. {
  1669. }
  1670. static inline bool operator == (const SparseMatConstIterator& it1, const SparseMatConstIterator& it2)
  1671. { return it1.m == it2.m && it1.hashidx == it2.hashidx && it1.ptr == it2.ptr; }
  1672. static inline bool operator != (const SparseMatConstIterator& it1, const SparseMatConstIterator& it2)
  1673. { return !(it1 == it2); }
  1674. inline SparseMatConstIterator& SparseMatConstIterator::operator = (const SparseMatConstIterator& it)
  1675. {
  1676.     if( this != &it )
  1677.     {
  1678.         m = it.m;
  1679.         hashidx = it.hashidx;
  1680.         ptr = it.ptr;
  1681.     }
  1682.     return *this;
  1683. }
  1684. template<typename _Tp> inline const _Tp& SparseMatConstIterator::value() const
  1685. { return *(_Tp*)ptr; }
  1686. inline const SparseMat::Node* SparseMatConstIterator::node() const
  1687. {
  1688.     return ptr && m && m->hdr ?
  1689.         (const SparseMat::Node*)(ptr - m->hdr->valueOffset) : 0;
  1690. }
  1691. inline SparseMatConstIterator SparseMatConstIterator::operator ++(int)
  1692. {
  1693.     SparseMatConstIterator it = *this;
  1694.     ++*this;
  1695.     return it;
  1696. }
  1697.     
  1698. inline void SparseMatConstIterator::seekEnd()
  1699. {
  1700.     if( m && m->hdr )
  1701.     {
  1702.         hashidx = m->hdr->hashtab.size();
  1703.         ptr = 0;
  1704.     }
  1705. }
  1706.     
  1707. inline SparseMatIterator::SparseMatIterator()
  1708. {}
  1709. inline SparseMatIterator::SparseMatIterator(SparseMat* _m)
  1710. : SparseMatConstIterator(_m)
  1711. {}
  1712. inline SparseMatIterator::SparseMatIterator(const SparseMatIterator& it)
  1713. : SparseMatConstIterator(it)
  1714. {
  1715. }
  1716. inline SparseMatIterator& SparseMatIterator::operator = (const SparseMatIterator& it)
  1717. {
  1718.     (SparseMatConstIterator&)*this = it;
  1719.     return *this;
  1720. }
  1721. template<typename _Tp> inline _Tp& SparseMatIterator::value() const
  1722. { return *(_Tp*)ptr; }
  1723. inline SparseMat::Node* SparseMatIterator::node() const
  1724. {
  1725.     return (SparseMat::Node*)SparseMatConstIterator::node();
  1726. }
  1727. inline SparseMatIterator& SparseMatIterator::operator ++()
  1728. {
  1729.     SparseMatConstIterator::operator ++();
  1730.     return *this;
  1731. }
  1732. inline SparseMatIterator SparseMatIterator::operator ++(int)
  1733. {
  1734.     SparseMatIterator it = *this;
  1735.     ++*this;
  1736.     return it;
  1737. }
  1738. template<typename _Tp> inline SparseMat_<_Tp>::SparseMat_()
  1739. { flags = MAGIC_VAL | DataType<_Tp>::type; }
  1740. template<typename _Tp> inline SparseMat_<_Tp>::SparseMat_(int _dims, const int* _sizes)
  1741. : SparseMat(_dims, _sizes, DataType<_Tp>::type)
  1742. {}
  1743. template<typename _Tp> inline SparseMat_<_Tp>::SparseMat_(const SparseMat& m)
  1744. {
  1745.     if( m.type() == DataType<_Tp>::type )
  1746.         *this = (const SparseMat_<_Tp>&)m;
  1747.     else
  1748.         m.convertTo(this, DataType<_Tp>::type);
  1749. }
  1750. template<typename _Tp> inline SparseMat_<_Tp>::SparseMat_(const SparseMat_<_Tp>& m)
  1751. {
  1752.     this->flags = m.flags;
  1753.     this->hdr = m.hdr;
  1754.     if( this->hdr )
  1755.         CV_XADD(&this->hdr->refcount, 1);
  1756. }
  1757. template<typename _Tp> inline SparseMat_<_Tp>::SparseMat_(const Mat& m)
  1758. {
  1759.     SparseMat sm(m);
  1760.     *this = sm;
  1761. }
  1762. template<typename _Tp> inline SparseMat_<_Tp>::SparseMat_(const MatND& m)
  1763. {
  1764.     SparseMat sm(m);
  1765.     *this = sm;
  1766. }
  1767. template<typename _Tp> inline SparseMat_<_Tp>::SparseMat_(const CvSparseMat* m)
  1768. {
  1769.     SparseMat sm(m);
  1770.     *this = sm;
  1771. }
  1772. template<typename _Tp> inline SparseMat_<_Tp>&
  1773. SparseMat_<_Tp>::operator = (const SparseMat_<_Tp>& m)
  1774. {
  1775.     if( this != &m )
  1776.     {
  1777.         if( m.hdr ) CV_XADD(&m.hdr->refcount, 1);
  1778.         release();
  1779.         flags = m.flags;
  1780.         hdr = m.hdr;
  1781.     }
  1782.     return *this;
  1783. }
  1784. template<typename _Tp> inline SparseMat_<_Tp>&
  1785. SparseMat_<_Tp>::operator = (const SparseMat& m)
  1786. {
  1787.     if( m.type() == DataType<_Tp>::type )
  1788.         return (*this = (const SparseMat_<_Tp>&)m);
  1789.     m.convertTo(*this, DataType<_Tp>::type);
  1790.     return *this;
  1791. }
  1792. template<typename _Tp> inline SparseMat_<_Tp>&
  1793. SparseMat_<_Tp>::operator = (const Mat& m)
  1794. { return (*this = SparseMat(m)); }
  1795. template<typename _Tp> inline SparseMat_<_Tp>&
  1796. SparseMat_<_Tp>::operator = (const MatND& m)
  1797. { return (*this = SparseMat(m)); }
  1798. template<typename _Tp> inline SparseMat_<_Tp>
  1799. SparseMat_<_Tp>::clone() const
  1800. {
  1801.     SparseMat_<_Tp> m;
  1802.     this->copyTo(m);
  1803.     return m;
  1804. }
  1805. template<typename _Tp> inline void
  1806. SparseMat_<_Tp>::create(int _dims, const int* _sizes)
  1807. {
  1808.     SparseMat::create(_dims, _sizes, DataType<_Tp>::type);
  1809. }
  1810. template<typename _Tp> inline
  1811. SparseMat_<_Tp>::operator CvSparseMat*() const
  1812. {
  1813.     return SparseMat::operator CvSparseMat*();
  1814. }
  1815. template<typename _Tp> inline int SparseMat_<_Tp>::type() const
  1816. { return DataType<_Tp>::type; }
  1817. template<typename _Tp> inline int SparseMat_<_Tp>::depth() const
  1818. { return DataType<_Tp>::depth; }
  1819. template<typename _Tp> inline int SparseMat_<_Tp>::channels() const
  1820. { return DataType<_Tp>::channels; }
  1821. template<typename _Tp> inline _Tp&
  1822. SparseMat_<_Tp>::ref(int i0, size_t* hashval)
  1823. { return SparseMat::ref<_Tp>(i0, hashval); }
  1824. template<typename _Tp> inline _Tp
  1825. SparseMat_<_Tp>::operator()(int i0, size_t* hashval) const
  1826. { return SparseMat::value<_Tp>(i0, hashval); }    
  1827.     
  1828. template<typename _Tp> inline _Tp&
  1829. SparseMat_<_Tp>::ref(int i0, int i1, size_t* hashval)
  1830. { return SparseMat::ref<_Tp>(i0, i1, hashval); }
  1831. template<typename _Tp> inline _Tp
  1832. SparseMat_<_Tp>::operator()(int i0, int i1, size_t* hashval) const
  1833. { return SparseMat::value<_Tp>(i0, i1, hashval); }
  1834. template<typename _Tp> inline _Tp&
  1835. SparseMat_<_Tp>::ref(int i0, int i1, int i2, size_t* hashval)
  1836. { return SparseMat::ref<_Tp>(i0, i1, i2, hashval); }
  1837. template<typename _Tp> inline _Tp
  1838. SparseMat_<_Tp>::operator()(int i0, int i1, int i2, size_t* hashval) const
  1839. { return SparseMat::value<_Tp>(i0, i1, i2, hashval); }
  1840. template<typename _Tp> inline _Tp&
  1841. SparseMat_<_Tp>::ref(const int* idx, size_t* hashval)
  1842. { return SparseMat::ref<_Tp>(idx, hashval); }
  1843. template<typename _Tp> inline _Tp
  1844. SparseMat_<_Tp>::operator()(const int* idx, size_t* hashval) const
  1845. { return SparseMat::value<_Tp>(idx, hashval); }
  1846. template<typename _Tp> inline SparseMatIterator_<_Tp> SparseMat_<_Tp>::begin()
  1847. { return SparseMatIterator_<_Tp>(this); }
  1848. template<typename _Tp> inline SparseMatConstIterator_<_Tp> SparseMat_<_Tp>::begin() const
  1849. { return SparseMatConstIterator_<_Tp>(this); }
  1850. template<typename _Tp> inline SparseMatIterator_<_Tp> SparseMat_<_Tp>::end()
  1851. { SparseMatIterator_<_Tp> it(this); it.seekEnd(); return it; }
  1852.     
  1853. template<typename _Tp> inline SparseMatConstIterator_<_Tp> SparseMat_<_Tp>::end() const
  1854. { SparseMatConstIterator_<_Tp> it(this); it.seekEnd(); return it; }
  1855. template<typename _Tp> inline
  1856. SparseMatConstIterator_<_Tp>::SparseMatConstIterator_()
  1857. {}
  1858. template<typename _Tp> inline
  1859. SparseMatConstIterator_<_Tp>::SparseMatConstIterator_(const SparseMat_<_Tp>* _m)
  1860. : SparseMatConstIterator(_m)
  1861. {}
  1862. template<typename _Tp> inline
  1863. SparseMatConstIterator_<_Tp>::SparseMatConstIterator_(const SparseMatConstIterator_<_Tp>& it)
  1864. : SparseMatConstIterator(it)
  1865. {}
  1866. template<typename _Tp> inline SparseMatConstIterator_<_Tp>&
  1867. SparseMatConstIterator_<_Tp>::operator = (const SparseMatConstIterator_<_Tp>& it)
  1868. { return ((SparseMatConstIterator&)*this = it); }
  1869. template<typename _Tp> inline const _Tp&
  1870. SparseMatConstIterator_<_Tp>::operator *() const
  1871. { return *(const _Tp*)this->ptr; }
  1872. template<typename _Tp> inline SparseMatConstIterator_<_Tp>&
  1873. SparseMatConstIterator_<_Tp>::operator ++()
  1874. {
  1875.     SparseMatConstIterator::operator ++();
  1876.     return *this;
  1877. }
  1878. template<typename _Tp> inline SparseMatConstIterator_<_Tp>
  1879. SparseMatConstIterator_<_Tp>::operator ++(int)
  1880. {
  1881.     SparseMatConstIterator it = *this;
  1882.     SparseMatConstIterator::operator ++();
  1883.     return it;
  1884. }
  1885. template<typename _Tp> inline
  1886. SparseMatIterator_<_Tp>::SparseMatIterator_()
  1887. {}
  1888. template<typename _Tp> inline
  1889. SparseMatIterator_<_Tp>::SparseMatIterator_(SparseMat_<_Tp>* _m)
  1890. : SparseMatConstIterator_<_Tp>(_m)
  1891. {}
  1892. template<typename _Tp> inline
  1893. SparseMatIterator_<_Tp>::SparseMatIterator_(const SparseMatIterator_<_Tp>& it)
  1894. : SparseMatConstIterator_<_Tp>(it)
  1895. {}
  1896. template<typename _Tp> inline SparseMatIterator_<_Tp>&
  1897. SparseMatIterator_<_Tp>::operator = (const SparseMatIterator_<_Tp>& it)
  1898. { return ((SparseMatIterator&)*this = it); }
  1899. template<typename _Tp> inline _Tp&
  1900. SparseMatIterator_<_Tp>::operator *() const
  1901. { return *(_Tp*)this->ptr; }
  1902. template<typename _Tp> inline SparseMatIterator_<_Tp>&
  1903. SparseMatIterator_<_Tp>::operator ++()
  1904. {
  1905.     SparseMatConstIterator::operator ++();
  1906.     return *this;
  1907. }
  1908. template<typename _Tp> inline SparseMatIterator_<_Tp>
  1909. SparseMatIterator_<_Tp>::operator ++(int)
  1910. {
  1911.     SparseMatIterator it = *this;
  1912.     SparseMatConstIterator::operator ++();
  1913.     return it;
  1914. }
  1915.     
  1916. }
  1917. #endif
  1918. #endif