1 /* 2 * By downloading, copying, installing or using the software you agree to this license. 3 * If you do not agree to this license, do not download, install, 4 * copy or use the software. 5 * 6 * 7 * License Agreement 8 * For Open Source Computer Vision Library 9 * (3-clause BSD License) 10 * 11 * Copyright (C) 2014-2015, NVIDIA Corporation, all rights reserved. 12 * Third party copyrights are property of their respective owners. 13 * 14 * Redistribution and use in source and binary forms, with or without modification, 15 * are permitted provided that the following conditions are met: 16 * 17 * * Redistributions of source code must retain the above copyright notice, 18 * this list of conditions and the following disclaimer. 19 * 20 * * Redistributions in binary form must reproduce the above copyright notice, 21 * this list of conditions and the following disclaimer in the documentation 22 * and/or other materials provided with the distribution. 23 * 24 * * Neither the names of the copyright holders nor the names of the contributors 25 * may be used to endorse or promote products derived from this software 26 * without specific prior written permission. 27 * 28 * This software is provided by the copyright holders and contributors "as is" and 29 * any express or implied warranties, including, but not limited to, the implied 30 * warranties of merchantability and fitness for a particular purpose are disclaimed. 31 * In no event shall copyright holders or contributors be liable for any direct, 32 * indirect, incidental, special, exemplary, or consequential damages 33 * (including, but not limited to, procurement of substitute goods or services; 34 * loss of use, data, or profits; or business interruption) however caused 35 * and on any theory of liability, whether in contract, strict liability, 36 * or tort (including negligence or otherwise) arising in any way out of 37 * the use of this software, even if advised of the possibility of such damage. 38 */ 39 40 #ifndef CAROTENE_FUNCTIONS_HPP 41 #define CAROTENE_FUNCTIONS_HPP 42 43 #include <carotene/definitions.hpp> 44 #include <carotene/types.hpp> 45 46 namespace CAROTENE_NS { 47 /* If this returns false, none of the functions will work. */ 48 bool isSupportedConfiguration(); 49 50 /* 51 For each point `p` within `size`, do: 52 dst[p] = src0[p] + src1[p] 53 */ 54 void add(const Size2D &size, 55 const u8 *src0Base, ptrdiff_t src0Stride, 56 const u8 *src1Base, ptrdiff_t src1Stride, 57 u8 *dstBase, ptrdiff_t dstStride, 58 CONVERT_POLICY policy); 59 60 void add(const Size2D &size, 61 const u8 *src0Base, ptrdiff_t src0Stride, 62 const u8 *src1Base, ptrdiff_t src1Stride, 63 s16 *dstBase, ptrdiff_t dstStride, 64 CONVERT_POLICY policy); 65 66 void add(const Size2D &size, 67 const u8 *src0Base, ptrdiff_t src0Stride, 68 const s16 *src1Base, ptrdiff_t src1Stride, 69 s16 *dstBase, ptrdiff_t dstStride, 70 CONVERT_POLICY policy); 71 72 void add(const Size2D &size, 73 const s8 *src0Base, ptrdiff_t src0Stride, 74 const s8 *src1Base, ptrdiff_t src1Stride, 75 s8 *dstBase, ptrdiff_t dstStride, 76 CONVERT_POLICY policy); 77 78 void add(const Size2D &size, 79 const s16 *src0Base, ptrdiff_t src0Stride, 80 const s16 *src1Base, ptrdiff_t src1Stride, 81 s16 *dstBase, ptrdiff_t dstStride, 82 CONVERT_POLICY policy); 83 84 void add(const Size2D &size, 85 const u16 * src0Base, ptrdiff_t src0Stride, 86 const u16 * src1Base, ptrdiff_t src1Stride, 87 u16 * dstBase, ptrdiff_t dstStride, 88 CONVERT_POLICY policy); 89 90 void add(const Size2D &size, 91 const s32 * src0Base, ptrdiff_t src0Stride, 92 const s32 * src1Base, ptrdiff_t src1Stride, 93 s32 * dstBase, ptrdiff_t dstStride, 94 CONVERT_POLICY policy); 95 96 void add(const Size2D &size, 97 const u32 * src0Base, ptrdiff_t src0Stride, 98 const u32 * src1Base, ptrdiff_t src1Stride, 99 u32 * dstBase, ptrdiff_t dstStride, 100 CONVERT_POLICY policy); 101 102 void add(const Size2D &size, 103 const f32 * src0Base, ptrdiff_t src0Stride, 104 const f32 * src1Base, ptrdiff_t src1Stride, 105 f32 * dstBase, ptrdiff_t dstStride); 106 107 /* 108 For each point `p` within `size`, do: 109 dst[p] = src0[p] - src1[p] 110 */ 111 void sub(const Size2D &size, 112 const u8 *src0Base, ptrdiff_t src0Stride, 113 const u8 *src1Base, ptrdiff_t src1Stride, 114 u8 *dstBase, ptrdiff_t dstStride, 115 CONVERT_POLICY policy); 116 117 void sub(const Size2D &size, 118 const u8 *src0Base, ptrdiff_t src0Stride, 119 const u8 *src1Base, ptrdiff_t src1Stride, 120 s16 *dstBase, ptrdiff_t dstStride, 121 CONVERT_POLICY policy); 122 123 void sub(const Size2D &size, 124 const u8 *src0Base, ptrdiff_t src0Stride, 125 const u8 *src1Base, ptrdiff_t src1Stride, 126 f32 *dstBase, ptrdiff_t dstStride); 127 128 void sub(const Size2D &size, 129 const u8 *src0Base, ptrdiff_t src0Stride, 130 const s16 *src1Base, ptrdiff_t src1Stride, 131 s16 *dstBase, ptrdiff_t dstStride, 132 CONVERT_POLICY policy); 133 134 void sub(const Size2D &size, 135 const s16 *src0Base, ptrdiff_t src0Stride, 136 const u8 *src1Base, ptrdiff_t src1Stride, 137 s16 *dstBase, ptrdiff_t dstStride, 138 CONVERT_POLICY policy); 139 140 void sub(const Size2D &size, 141 const s16 *src0Base, ptrdiff_t src0Stride, 142 const s16 *src1Base, ptrdiff_t src1Stride, 143 s16 *dstBase, ptrdiff_t dstStride, 144 CONVERT_POLICY policy); 145 146 void sub(const Size2D &size, 147 const s8 *src0Base, ptrdiff_t src0Stride, 148 const s8 *src1Base, ptrdiff_t src1Stride, 149 s8 *dstBase, ptrdiff_t dstStride, 150 CONVERT_POLICY policy); 151 152 void sub(const Size2D &size, 153 const u16 * src0Base, ptrdiff_t src0Stride, 154 const u16 * src1Base, ptrdiff_t src1Stride, 155 u16 * dstBase, ptrdiff_t dstStride, 156 CONVERT_POLICY policy); 157 158 void sub(const Size2D &size, 159 const s32 * src0Base, ptrdiff_t src0Stride, 160 const s32 * src1Base, ptrdiff_t src1Stride, 161 s32 * dstBase, ptrdiff_t dstStride, 162 CONVERT_POLICY policy); 163 164 void sub(const Size2D &size, 165 const u32 * src0Base, ptrdiff_t src0Stride, 166 const u32 * src1Base, ptrdiff_t src1Stride, 167 u32 * dstBase, ptrdiff_t dstStride, 168 CONVERT_POLICY policy); 169 170 void sub(const Size2D &size, 171 const f32 * src0Base, ptrdiff_t src0Stride, 172 const f32 * src1Base, ptrdiff_t src1Stride, 173 f32 * dstBase, ptrdiff_t dstStride); 174 175 /* 176 For each point `p` within `size`, do: 177 dst[p] = src0[p] * alpha + src1[p] * beta + gamma 178 */ 179 void addWeighted(const Size2D &size, 180 const u8 * src0Base, ptrdiff_t src0Stride, 181 const u8 * src1Base, ptrdiff_t src1Stride, 182 u8 * dstBase, ptrdiff_t dstStride, 183 f32 alpha, f32 beta, f32 gamma); 184 185 void addWeighted(const Size2D &size, 186 const s8 * src0Base, ptrdiff_t src0Stride, 187 const s8 * src1Base, ptrdiff_t src1Stride, 188 s8 * dstBase, ptrdiff_t dstStride, 189 f32 alpha, f32 beta, f32 gamma); 190 191 void addWeighted(const Size2D &size, 192 const u16 * src0Base, ptrdiff_t src0Stride, 193 const u16 * src1Base, ptrdiff_t src1Stride, 194 u16 * dstBase, ptrdiff_t dstStride, 195 f32 alpha, f32 beta, f32 gamma); 196 197 void addWeighted(const Size2D &size, 198 const s16 * src0Base, ptrdiff_t src0Stride, 199 const s16 * src1Base, ptrdiff_t src1Stride, 200 s16 * dstBase, ptrdiff_t dstStride, 201 f32 alpha, f32 beta, f32 gamma); 202 203 void addWeighted(const Size2D &size, 204 const u32 * src0Base, ptrdiff_t src0Stride, 205 const u32 * src1Base, ptrdiff_t src1Stride, 206 u32 * dstBase, ptrdiff_t dstStride, 207 f32 alpha, f32 beta, f32 gamma); 208 209 void addWeighted(const Size2D &size, 210 const s32 * src0Base, ptrdiff_t src0Stride, 211 const s32 * src1Base, ptrdiff_t src1Stride, 212 s32 * dstBase, ptrdiff_t dstStride, 213 f32 alpha, f32 beta, f32 gamma); 214 215 void addWeighted(const Size2D &size, 216 const f32 * src0Base, ptrdiff_t src0Stride, 217 const f32 * src1Base, ptrdiff_t src1Stride, 218 f32 * dstBase, ptrdiff_t dstStride, 219 f32 alpha, f32 beta, f32 gamma); 220 221 /* 222 For each point `p` within `size`, do: 223 dst[p] = min(src0[p], src1[p]) 224 */ 225 void min(const Size2D &size, 226 const u8 *src0Base, ptrdiff_t src0Stride, 227 const u8 *src1Base, ptrdiff_t src1Stride, 228 u8 *dstBase, ptrdiff_t dstStride); 229 230 void min(const Size2D &size, 231 const s8 *src0Base, ptrdiff_t src0Stride, 232 const s8 *src1Base, ptrdiff_t src1Stride, 233 s8 *dstBase, ptrdiff_t dstStride); 234 235 void min(const Size2D &size, 236 const u16 * src0Base, ptrdiff_t src0Stride, 237 const u16 * src1Base, ptrdiff_t src1Stride, 238 u16 * dstBase, ptrdiff_t dstStride); 239 240 void min(const Size2D &size, 241 const s16 *src0Base, ptrdiff_t src0Stride, 242 const s16 *src1Base, ptrdiff_t src1Stride, 243 s16 *dstBase, ptrdiff_t dstStride); 244 245 void min(const Size2D &size, 246 const s32 * src0Base, ptrdiff_t src0Stride, 247 const s32 * src1Base, ptrdiff_t src1Stride, 248 s32 * dstBase, ptrdiff_t dstStride); 249 250 void min(const Size2D &size, 251 const u32 * src0Base, ptrdiff_t src0Stride, 252 const u32 * src1Base, ptrdiff_t src1Stride, 253 u32 * dstBase, ptrdiff_t dstStride); 254 255 void min(const Size2D &size, 256 const f32 * src0Base, ptrdiff_t src0Stride, 257 const f32 * src1Base, ptrdiff_t src1Stride, 258 f32 * dstBase, ptrdiff_t dstStride); 259 260 /* 261 For each point `p` within `size`, do: 262 dst[p] = max(src0[p], src1[p]) 263 */ 264 void max(const Size2D &size, 265 const u8 *src0Base, ptrdiff_t src0Stride, 266 const u8 *src1Base, ptrdiff_t src1Stride, 267 u8 *dstBase, ptrdiff_t dstStride); 268 269 void max(const Size2D &size, 270 const s8 *src0Base, ptrdiff_t src0Stride, 271 const s8 *src1Base, ptrdiff_t src1Stride, 272 s8 *dstBase, ptrdiff_t dstStride); 273 274 void max(const Size2D &size, 275 const u16 * src0Base, ptrdiff_t src0Stride, 276 const u16 * src1Base, ptrdiff_t src1Stride, 277 u16 * dstBase, ptrdiff_t dstStride); 278 279 void max(const Size2D &size, 280 const s16 *src0Base, ptrdiff_t src0Stride, 281 const s16 *src1Base, ptrdiff_t src1Stride, 282 s16 *dstBase, ptrdiff_t dstStride); 283 284 void max(const Size2D &size, 285 const s32 * src0Base, ptrdiff_t src0Stride, 286 const s32 * src1Base, ptrdiff_t src1Stride, 287 s32 * dstBase, ptrdiff_t dstStride); 288 289 void max(const Size2D &size, 290 const u32 * src0Base, ptrdiff_t src0Stride, 291 const u32 * src1Base, ptrdiff_t src1Stride, 292 u32 * dstBase, ptrdiff_t dstStride); 293 294 void max(const Size2D &size, 295 const f32 * src0Base, ptrdiff_t src0Stride, 296 const f32 * src1Base, ptrdiff_t src1Stride, 297 f32 * dstBase, ptrdiff_t dstStride); 298 299 /* 300 For each point `p` within `size`, do: 301 dst[p] = src0[p] * src1[p] * scale 302 303 NOTE: ROUND_TO_ZERO convert policy is used 304 */ 305 void mul(const Size2D &size, 306 const u8 * src0Base, ptrdiff_t src0Stride, 307 const u8 * src1Base, ptrdiff_t src1Stride, 308 u8 * dstBase, ptrdiff_t dstStride, 309 f32 scale, 310 CONVERT_POLICY cpolicy); 311 312 void mul(const Size2D &size, 313 const u8 * src0Base, ptrdiff_t src0Stride, 314 const u8 * src1Base, ptrdiff_t src1Stride, 315 s16 * dstBase, ptrdiff_t dstStride, 316 f32 scale, 317 CONVERT_POLICY cpolicy); 318 319 void mul(const Size2D &size, 320 const u8 * src0Base, ptrdiff_t src0Stride, 321 const s16 * src1Base, ptrdiff_t src1Stride, 322 s16 * dstBase, ptrdiff_t dstStride, 323 f32 scale, 324 CONVERT_POLICY cpolicy); 325 326 void mul(const Size2D &size, 327 const s8 * src0Base, ptrdiff_t src0Stride, 328 const s8 * src1Base, ptrdiff_t src1Stride, 329 s8 * dstBase, ptrdiff_t dstStride, 330 f32 scale, 331 CONVERT_POLICY cpolicy); 332 333 void mul(const Size2D &size, 334 const u16 * src0Base, ptrdiff_t src0Stride, 335 const u16 * src1Base, ptrdiff_t src1Stride, 336 u16 * dstBase, ptrdiff_t dstStride, 337 f32 scale, 338 CONVERT_POLICY cpolicy); 339 340 void mul(const Size2D &size, 341 const s16 * src0Base, ptrdiff_t src0Stride, 342 const s16 * src1Base, ptrdiff_t src1Stride, 343 s16 * dstBase, ptrdiff_t dstStride, 344 f32 scale, 345 CONVERT_POLICY cpolicy); 346 347 void mul(const Size2D &size, 348 const s32 * src0Base, ptrdiff_t src0Stride, 349 const s32 * src1Base, ptrdiff_t src1Stride, 350 s32 * dstBase, ptrdiff_t dstStride, 351 f64 scale, 352 CONVERT_POLICY cpolicy); 353 354 void mul(const Size2D &size, 355 const f32 * src0Base, ptrdiff_t src0Stride, 356 const f32 * src1Base, ptrdiff_t src1Stride, 357 f32 * dstBase, ptrdiff_t dstStride, 358 f32 scale); 359 360 /* 361 For each point `p` within `size`, do: 362 dst[p] = src0[p] * scale / src1[p] 363 364 NOTE: ROUND_TO_ZERO convert policy is used 365 */ 366 void div(const Size2D &size, 367 const u8 * src0Base, ptrdiff_t src0Stride, 368 const u8 * src1Base, ptrdiff_t src1Stride, 369 u8 * dstBase, ptrdiff_t dstStride, 370 f32 scale, 371 CONVERT_POLICY cpolicy); 372 373 void div(const Size2D &size, 374 const u8 * src0Base, ptrdiff_t src0Stride, 375 const u8 * src1Base, ptrdiff_t src1Stride, 376 s16 * dstBase, ptrdiff_t dstStride, 377 f32 scale, 378 CONVERT_POLICY cpolicy); 379 380 void div(const Size2D &size, 381 const u8 * src0Base, ptrdiff_t src0Stride, 382 const s16 * src1Base, ptrdiff_t src1Stride, 383 s16 * dstBase, ptrdiff_t dstStride, 384 f32 scale, 385 CONVERT_POLICY cpolicy); 386 387 void div(const Size2D &size, 388 const s8 * src0Base, ptrdiff_t src0Stride, 389 const s8 * src1Base, ptrdiff_t src1Stride, 390 s8 * dstBase, ptrdiff_t dstStride, 391 f32 scale, 392 CONVERT_POLICY cpolicy); 393 394 void div(const Size2D &size, 395 const u16 * src0Base, ptrdiff_t src0Stride, 396 const u16 * src1Base, ptrdiff_t src1Stride, 397 u16 * dstBase, ptrdiff_t dstStride, 398 f32 scale, 399 CONVERT_POLICY cpolicy); 400 401 void div(const Size2D &size, 402 const s16 * src0Base, ptrdiff_t src0Stride, 403 const s16 * src1Base, ptrdiff_t src1Stride, 404 s16 * dstBase, ptrdiff_t dstStride, 405 f32 scale, 406 CONVERT_POLICY cpolicy); 407 408 void div(const Size2D &size, 409 const s32 * src0Base, ptrdiff_t src0Stride, 410 const s32 * src1Base, ptrdiff_t src1Stride, 411 s32 * dstBase, ptrdiff_t dstStride, 412 f32 scale, 413 CONVERT_POLICY cpolicy); 414 415 void div(const Size2D &size, 416 const f32 * src0Base, ptrdiff_t src0Stride, 417 const f32 * src1Base, ptrdiff_t src1Stride, 418 f32 * dstBase, ptrdiff_t dstStride, 419 f32 scale); 420 421 /* 422 For each point `p` within `size`, do: 423 dst[p] = scale / src[p] 424 425 NOTE: ROUND_TO_ZERO convert policy is used 426 */ 427 void reciprocal(const Size2D &size, 428 const u8 * srcBase, ptrdiff_t srcStride, 429 u8 * dstBase, ptrdiff_t dstStride, 430 f32 scale, 431 CONVERT_POLICY cpolicy); 432 433 void reciprocal(const Size2D &size, 434 const s8 * srcBase, ptrdiff_t srcStride, 435 s8 * dstBase, ptrdiff_t dstStride, 436 f32 scale, 437 CONVERT_POLICY cpolicy); 438 439 void reciprocal(const Size2D &size, 440 const u16 * srcBase, ptrdiff_t srcStride, 441 u16 * dstBase, ptrdiff_t dstStride, 442 f32 scale, 443 CONVERT_POLICY cpolicy); 444 445 void reciprocal(const Size2D &size, 446 const s16 * srcBase, ptrdiff_t srcStride, 447 s16 * dstBase, ptrdiff_t dstStride, 448 f32 scale, 449 CONVERT_POLICY cpolicy); 450 451 void reciprocal(const Size2D &size, 452 const s32 * srcBase, ptrdiff_t srcStride, 453 s32 * dstBase, ptrdiff_t dstStride, 454 f32 scale, 455 CONVERT_POLICY cpolicy); 456 457 void reciprocal(const Size2D &size, 458 const f32 * srcBase, ptrdiff_t srcStride, 459 f32 * dstBase, ptrdiff_t dstStride, 460 f32 scale); 461 462 /* 463 For each point `p` within `size`, set `dst[p]` to the median 464 of `src[p]` and the 8 points around it. If `srcMargin` is 465 zero on any side, get the neighbors on that side by replicating 466 the edge. 467 */ 468 bool isMedianFilter3x3Supported(const Size2D &size, u32 numChannels); 469 void medianFilter3x3(const Size2D &size, u32 numChannels, 470 const u8 *srcBase, ptrdiff_t srcStride, 471 const Margin &srcMargin, 472 u8 *dstBase, ptrdiff_t dstStride); 473 474 /* 475 Apply a half Gaussian filter + half Scale, as one level of a Gaussian 476 pyramid. For all `p` within `dstSize`, set `dst[p]` to `f[2 * p]`, where 477 `f` is an image of size srcSize obtained by filtering src with the 5x5 478 Gaussian kernel ([1 4 6 4 1]'*[1 4 6 4 1]/256) using the border mode 479 passed in, and round-to-zero rounding. 480 dstSize must be (srcSize.width / 2, srcSize.height / 2), rounded by any method. 481 */ 482 bool isGaussianPyramidDownRTZSupported(const Size2D &srcSize, const Size2D &dstSize, BORDER_MODE border); 483 void gaussianPyramidDownRTZ(const Size2D &srcSize, 484 const u8 *srcBase, ptrdiff_t srcStride, 485 const Size2D &dstSize, 486 u8 *dstBase, ptrdiff_t dstStride, 487 BORDER_MODE border, u8 borderValue); 488 489 /* Same as above, but uses round-half-up rounding. */ 490 491 bool isGaussianPyramidDownU8Supported(const Size2D &srcSize, const Size2D &dstSize, u8 cn); 492 void gaussianPyramidDown(const Size2D &srcSize, 493 const u8 *srcBase, ptrdiff_t srcStride, 494 const Size2D &dstSize, 495 u8 *dstBase, ptrdiff_t dstStride, u8 cn); 496 497 498 bool isGaussianPyramidDownS16Supported(const Size2D &srcSize, const Size2D &dstSize, u8 cn); 499 void gaussianPyramidDown(const Size2D &srcSize, 500 const s16 *srcBase, ptrdiff_t srcStride, 501 const Size2D &dstSize, 502 s16 *dstBase, ptrdiff_t dstStride, u8 cn); 503 504 bool isGaussianPyramidDownF32Supported(const Size2D &srcSize, const Size2D &dstSize, u8 cn); 505 void gaussianPyramidDown(const Size2D &srcSize, 506 const f32 *srcBase, ptrdiff_t srcStride, 507 const Size2D &dstSize, 508 f32 *dstBase, ptrdiff_t dstStride, u8 cn); 509 510 bool isGaussianPyramidUpU8Supported(const Size2D &srcSize, const Size2D &dstSize, u8 cn); 511 void gaussianPyramidUp(const Size2D &srcSize, 512 const u8 *srcBase, ptrdiff_t srcStride, 513 const Size2D &dstSize, 514 u8 *dstBase, ptrdiff_t dstStride, u8 cn); 515 516 bool isGaussianPyramidUpS16Supported(const Size2D &srcSize, const Size2D &dstSize, u8 cn); 517 void gaussianPyramidUp(const Size2D &srcSize, 518 const s16 *srcBase, ptrdiff_t srcStride, 519 const Size2D &dstSize, 520 s16 *dstBase, ptrdiff_t dstStride, u8 cn); 521 522 /* 523 For each point `p` within `size`, do: 524 dst[p] = src[p] > threshold ? trueValue : falseValue 525 */ 526 void thresholdBinary(const Size2D &size, 527 const u8 *srcBase, ptrdiff_t srcStride, 528 u8 *dstBase, ptrdiff_t dstStride, 529 u8 threshold, u8 trueValue = 255, u8 falseValue = 0); 530 531 /* 532 For each point `p` within `size`, do: 533 dst[p] = lower <= src[p] && src[p] <= upper ? trueValue : falseValue 534 */ 535 void thresholdRange(const Size2D &size, 536 const u8 *srcBase, ptrdiff_t srcStride, 537 u8 *dstBase, ptrdiff_t dstStride, 538 u8 lowerThreshold, u8 upperThreshold, 539 u8 trueValue = 255, u8 falseValue = 0); 540 541 /* 542 For each point `p` within `size`, do: 543 dst[p] = src[p] > threshold ? value : 0 544 */ 545 void thresholdBinary(const Size2D &size, 546 const u8 *srcBase, ptrdiff_t srcStride, 547 u8 *dstBase, ptrdiff_t dstStride, 548 u8 threshold, u8 value); 549 550 void thresholdBinary(const Size2D &size, 551 const s8 *srcBase, ptrdiff_t srcStride, 552 s8 *dstBase, ptrdiff_t dstStride, 553 s8 threshold, s8 value); 554 555 void thresholdBinary(const Size2D &size, 556 const u16 *srcBase, ptrdiff_t srcStride, 557 u16 *dstBase, ptrdiff_t dstStride, 558 u16 threshold, u16 value); 559 560 void thresholdBinary(const Size2D &size, 561 const s16 *srcBase, ptrdiff_t srcStride, 562 s16 *dstBase, ptrdiff_t dstStride, 563 s16 threshold, s16 value); 564 565 void thresholdBinary(const Size2D &size, 566 const s32 *srcBase, ptrdiff_t srcStride, 567 s32 *dstBase, ptrdiff_t dstStride, 568 s32 threshold, s32 value); 569 570 void thresholdBinary(const Size2D &size, 571 const f32 *srcBase, ptrdiff_t srcStride, 572 f32 *dstBase, ptrdiff_t dstStride, 573 f32 threshold, f32 value); 574 575 /* 576 For each point `p` within `size`, do: 577 dst[p] = src[p] > threshold ? 0 : value 578 */ 579 void thresholdBinaryInv(const Size2D &size, 580 const u8 *srcBase, ptrdiff_t srcStride, 581 u8 *dstBase, ptrdiff_t dstStride, 582 u8 threshold, u8 value); 583 584 void thresholdBinaryInv(const Size2D &size, 585 const s8 *srcBase, ptrdiff_t srcStride, 586 s8 *dstBase, ptrdiff_t dstStride, 587 s8 threshold, s8 value); 588 589 void thresholdBinaryInv(const Size2D &size, 590 const u16 *srcBase, ptrdiff_t srcStride, 591 u16 *dstBase, ptrdiff_t dstStride, 592 u16 threshold, u16 value); 593 594 void thresholdBinaryInv(const Size2D &size, 595 const s16 *srcBase, ptrdiff_t srcStride, 596 s16 *dstBase, ptrdiff_t dstStride, 597 s16 threshold, s16 value); 598 599 void thresholdBinaryInv(const Size2D &size, 600 const s32 *srcBase, ptrdiff_t srcStride, 601 s32 *dstBase, ptrdiff_t dstStride, 602 s32 threshold, s32 value); 603 604 void thresholdBinaryInv(const Size2D &size, 605 const f32 *srcBase, ptrdiff_t srcStride, 606 f32 *dstBase, ptrdiff_t dstStride, 607 f32 threshold, f32 value); 608 609 /* 610 For each point `p` within `size`, do: 611 dst[p] = src[p] > threshold ? threshold : src[p] 612 */ 613 void thresholdTruncate(const Size2D &size, 614 const u8 *srcBase, ptrdiff_t srcStride, 615 u8 *dstBase, ptrdiff_t dstStride, 616 u8 threshold); 617 618 void thresholdTruncate(const Size2D &size, 619 const s8 *srcBase, ptrdiff_t srcStride, 620 s8 *dstBase, ptrdiff_t dstStride, 621 s8 threshold); 622 623 void thresholdTruncate(const Size2D &size, 624 const u16 *srcBase, ptrdiff_t srcStride, 625 u16 *dstBase, ptrdiff_t dstStride, 626 u16 threshold); 627 628 void thresholdTruncate(const Size2D &size, 629 const s16 *srcBase, ptrdiff_t srcStride, 630 s16 *dstBase, ptrdiff_t dstStride, 631 s16 threshold); 632 633 void thresholdTruncate(const Size2D &size, 634 const s32 *srcBase, ptrdiff_t srcStride, 635 s32 *dstBase, ptrdiff_t dstStride, 636 s32 threshold); 637 638 void thresholdTruncate(const Size2D &size, 639 const f32 *srcBase, ptrdiff_t srcStride, 640 f32 *dstBase, ptrdiff_t dstStride, 641 f32 threshold); 642 643 /* 644 For each point `p` within `size`, do: 645 dst[p] = src[p] > threshold ? src[p] : 0 646 */ 647 void thresholdToZero(const Size2D &size, 648 const u8 *srcBase, ptrdiff_t srcStride, 649 u8 *dstBase, ptrdiff_t dstStride, 650 u8 threshold); 651 652 void thresholdToZero(const Size2D &size, 653 const s8 *srcBase, ptrdiff_t srcStride, 654 s8 *dstBase, ptrdiff_t dstStride, 655 s8 threshold); 656 657 void thresholdToZero(const Size2D &size, 658 const u16 *srcBase, ptrdiff_t srcStride, 659 u16 *dstBase, ptrdiff_t dstStride, 660 u16 threshold); 661 662 void thresholdToZero(const Size2D &size, 663 const s16 *srcBase, ptrdiff_t srcStride, 664 s16 *dstBase, ptrdiff_t dstStride, 665 s16 threshold); 666 667 void thresholdToZero(const Size2D &size, 668 const s32 *srcBase, ptrdiff_t srcStride, 669 s32 *dstBase, ptrdiff_t dstStride, 670 s32 threshold); 671 672 void thresholdToZero(const Size2D &size, 673 const f32 *srcBase, ptrdiff_t srcStride, 674 f32 *dstBase, ptrdiff_t dstStride, 675 f32 threshold); 676 677 /* 678 For each point `p` within `size`, do: 679 dst[p] = src[p] > threshold ? 0 : src[p] 680 */ 681 void thresholdToZeroInv(const Size2D &size, 682 const u8 *srcBase, ptrdiff_t srcStride, 683 u8 *dstBase, ptrdiff_t dstStride, 684 u8 threshold); 685 686 void thresholdToZeroInv(const Size2D &size, 687 const s8 *srcBase, ptrdiff_t srcStride, 688 s8 *dstBase, ptrdiff_t dstStride, 689 s8 threshold); 690 691 void thresholdToZeroInv(const Size2D &size, 692 const u16 *srcBase, ptrdiff_t srcStride, 693 u16 *dstBase, ptrdiff_t dstStride, 694 u16 threshold); 695 696 void thresholdToZeroInv(const Size2D &size, 697 const s16 *srcBase, ptrdiff_t srcStride, 698 s16 *dstBase, ptrdiff_t dstStride, 699 s16 threshold); 700 701 void thresholdToZeroInv(const Size2D &size, 702 const s32 *srcBase, ptrdiff_t srcStride, 703 s32 *dstBase, ptrdiff_t dstStride, 704 s32 threshold); 705 706 void thresholdToZeroInv(const Size2D &size, 707 const f32 *srcBase, ptrdiff_t srcStride, 708 f32 *dstBase, ptrdiff_t dstStride, 709 f32 threshold); 710 711 /* 712 For each point `p` within `size`, do: 713 dst[p] = abs(src0[p] - src1[p]) 714 */ 715 void absDiff(const Size2D &size, 716 const u8 *src0Base, ptrdiff_t src0Stride, 717 const u8 *src1Base, ptrdiff_t src1Stride, 718 u8 *dstBase, ptrdiff_t dstStride); 719 720 void absDiff(const Size2D &size, 721 const u16 *src0Base, ptrdiff_t src0Stride, 722 const u16 *src1Base, ptrdiff_t src1Stride, 723 u16 *dstBase, ptrdiff_t dstStride); 724 725 void absDiff(const Size2D &size, 726 const s8 *src0Base, ptrdiff_t src0Stride, 727 const s8 *src1Base, ptrdiff_t src1Stride, 728 s8 *dstBase, ptrdiff_t dstStride); 729 730 void absDiff(const Size2D &size, 731 const s16 *src0Base, ptrdiff_t src0Stride, 732 const s16 *src1Base, ptrdiff_t src1Stride, 733 s16 *dstBase, ptrdiff_t dstStride); 734 735 void absDiff(const Size2D &size, 736 const s32 * src0Base, ptrdiff_t src0Stride, 737 const s32 * src1Base, ptrdiff_t src1Stride, 738 s32 * dstBase, ptrdiff_t dstStride); 739 740 void absDiff(const Size2D &size, 741 const f32 * src0Base, ptrdiff_t src0Stride, 742 const f32 * src1Base, ptrdiff_t src1Stride, 743 f32 * dstBase, ptrdiff_t dstStride); 744 745 /* 746 For each point `p` within `size`, do: 747 dst[p] = ~src[p] 748 */ 749 void bitwiseNot(const Size2D &size, 750 const u8 *srcBase, ptrdiff_t srcStride, 751 u8 *dstBase, ptrdiff_t dstStride); 752 753 /* 754 For each point `p` within `size`, do: 755 dst[p] = src0[p] & src1[p] 756 */ 757 void bitwiseAnd(const Size2D &size, 758 const u8 *src0Base, ptrdiff_t src0Stride, 759 const u8 *src1Base, ptrdiff_t src1Stride, 760 u8 *dstBase, ptrdiff_t dstStride); 761 762 /* 763 For each point `p` within `size`, do: 764 dst[p] = src0[p] | src1[p] 765 */ 766 void bitwiseOr(const Size2D &size, 767 const u8 *src0Base, ptrdiff_t src0Stride, 768 const u8 *src1Base, ptrdiff_t src1Stride, 769 u8 *dstBase, ptrdiff_t dstStride); 770 771 /* 772 For each point `p` within `size`, do: 773 dst[p] = src0[p] ^ src1[p] 774 */ 775 void bitwiseXor(const Size2D &size, 776 const u8 *src0Base, ptrdiff_t src0Stride, 777 const u8 *src1Base, ptrdiff_t src1Stride, 778 u8 *dstBase, ptrdiff_t dstStride); 779 780 /* 781 For each point `p` within `size`, do: 782 dst[p] = src0[p] == src1[p] ? 255 : 0 783 */ 784 void cmpEQ(const Size2D &size, 785 const u8 *src0Base, ptrdiff_t src0Stride, 786 const u8 *src1Base, ptrdiff_t src1Stride, 787 u8 *dstBase, ptrdiff_t dstStride); 788 789 void cmpEQ(const Size2D &size, 790 const s8 *src0Base, ptrdiff_t src0Stride, 791 const s8 *src1Base, ptrdiff_t src1Stride, 792 u8 *dstBase, ptrdiff_t dstStride); 793 794 void cmpEQ(const Size2D &size, 795 const u16 *src0Base, ptrdiff_t src0Stride, 796 const u16 *src1Base, ptrdiff_t src1Stride, 797 u8 *dstBase, ptrdiff_t dstStride); 798 799 void cmpEQ(const Size2D &size, 800 const s16 *src0Base, ptrdiff_t src0Stride, 801 const s16 *src1Base, ptrdiff_t src1Stride, 802 u8 *dstBase, ptrdiff_t dstStride); 803 804 void cmpEQ(const Size2D &size, 805 const u32 *src0Base, ptrdiff_t src0Stride, 806 const u32 *src1Base, ptrdiff_t src1Stride, 807 u8 *dstBase, ptrdiff_t dstStride); 808 809 void cmpEQ(const Size2D &size, 810 const s32 *src0Base, ptrdiff_t src0Stride, 811 const s32 *src1Base, ptrdiff_t src1Stride, 812 u8 *dstBase, ptrdiff_t dstStride); 813 814 void cmpEQ(const Size2D &size, 815 const f32 *src0Base, ptrdiff_t src0Stride, 816 const f32 *src1Base, ptrdiff_t src1Stride, 817 u8 *dstBase, ptrdiff_t dstStride); 818 819 /* 820 For each point `p` within `size`, do: 821 dst[p] = src0[p] != src1[p] ? 255 : 0 822 */ 823 void cmpNE(const Size2D &size, 824 const u8 *src0Base, ptrdiff_t src0Stride, 825 const u8 *src1Base, ptrdiff_t src1Stride, 826 u8 *dstBase, ptrdiff_t dstStride); 827 828 void cmpNE(const Size2D &size, 829 const s8 *src0Base, ptrdiff_t src0Stride, 830 const s8 *src1Base, ptrdiff_t src1Stride, 831 u8 *dstBase, ptrdiff_t dstStride); 832 833 void cmpNE(const Size2D &size, 834 const u16 *src0Base, ptrdiff_t src0Stride, 835 const u16 *src1Base, ptrdiff_t src1Stride, 836 u8 *dstBase, ptrdiff_t dstStride); 837 838 void cmpNE(const Size2D &size, 839 const s16 *src0Base, ptrdiff_t src0Stride, 840 const s16 *src1Base, ptrdiff_t src1Stride, 841 u8 *dstBase, ptrdiff_t dstStride); 842 843 void cmpNE(const Size2D &size, 844 const u32 *src0Base, ptrdiff_t src0Stride, 845 const u32 *src1Base, ptrdiff_t src1Stride, 846 u8 *dstBase, ptrdiff_t dstStride); 847 848 void cmpNE(const Size2D &size, 849 const s32 *src0Base, ptrdiff_t src0Stride, 850 const s32 *src1Base, ptrdiff_t src1Stride, 851 u8 *dstBase, ptrdiff_t dstStride); 852 853 void cmpNE(const Size2D &size, 854 const f32 *src0Base, ptrdiff_t src0Stride, 855 const f32 *src1Base, ptrdiff_t src1Stride, 856 u8 *dstBase, ptrdiff_t dstStride); 857 858 /* 859 For each point `p` within `size`, do: 860 dst[p] = src0[p] > src1[p] ? 255 : 0 861 */ 862 void cmpGT(const Size2D &size, 863 const u8 *src0Base, ptrdiff_t src0Stride, 864 const u8 *src1Base, ptrdiff_t src1Stride, 865 u8 *dstBase, ptrdiff_t dstStride); 866 867 void cmpGT(const Size2D &size, 868 const s8 *src0Base, ptrdiff_t src0Stride, 869 const s8 *src1Base, ptrdiff_t src1Stride, 870 u8 *dstBase, ptrdiff_t dstStride); 871 872 void cmpGT(const Size2D &size, 873 const u16 *src0Base, ptrdiff_t src0Stride, 874 const u16 *src1Base, ptrdiff_t src1Stride, 875 u8 *dstBase, ptrdiff_t dstStride); 876 877 void cmpGT(const Size2D &size, 878 const s16 *src0Base, ptrdiff_t src0Stride, 879 const s16 *src1Base, ptrdiff_t src1Stride, 880 u8 *dstBase, ptrdiff_t dstStride); 881 882 void cmpGT(const Size2D &size, 883 const u32 *src0Base, ptrdiff_t src0Stride, 884 const u32 *src1Base, ptrdiff_t src1Stride, 885 u8 *dstBase, ptrdiff_t dstStride); 886 887 void cmpGT(const Size2D &size, 888 const s32 *src0Base, ptrdiff_t src0Stride, 889 const s32 *src1Base, ptrdiff_t src1Stride, 890 u8 *dstBase, ptrdiff_t dstStride); 891 892 void cmpGT(const Size2D &size, 893 const f32 *src0Base, ptrdiff_t src0Stride, 894 const f32 *src1Base, ptrdiff_t src1Stride, 895 u8 *dstBase, ptrdiff_t dstStride); 896 897 /* 898 For each point `p` within `size`, do: 899 dst[p] = src0[p] >= src1[p] ? 255 : 0 900 */ 901 void cmpGE(const Size2D &size, 902 const u8 *src0Base, ptrdiff_t src0Stride, 903 const u8 *src1Base, ptrdiff_t src1Stride, 904 u8 *dstBase, ptrdiff_t dstStride); 905 906 void cmpGE(const Size2D &size, 907 const s8 *src0Base, ptrdiff_t src0Stride, 908 const s8 *src1Base, ptrdiff_t src1Stride, 909 u8 *dstBase, ptrdiff_t dstStride); 910 911 void cmpGE(const Size2D &size, 912 const u16 *src0Base, ptrdiff_t src0Stride, 913 const u16 *src1Base, ptrdiff_t src1Stride, 914 u8 *dstBase, ptrdiff_t dstStride); 915 916 void cmpGE(const Size2D &size, 917 const s16 *src0Base, ptrdiff_t src0Stride, 918 const s16 *src1Base, ptrdiff_t src1Stride, 919 u8 *dstBase, ptrdiff_t dstStride); 920 921 void cmpGE(const Size2D &size, 922 const u32 *src0Base, ptrdiff_t src0Stride, 923 const u32 *src1Base, ptrdiff_t src1Stride, 924 u8 *dstBase, ptrdiff_t dstStride); 925 926 void cmpGE(const Size2D &size, 927 const s32 *src0Base, ptrdiff_t src0Stride, 928 const s32 *src1Base, ptrdiff_t src1Stride, 929 u8 *dstBase, ptrdiff_t dstStride); 930 931 void cmpGE(const Size2D &size, 932 const f32 *src0Base, ptrdiff_t src0Stride, 933 const f32 *src1Base, ptrdiff_t src1Stride, 934 u8 *dstBase, ptrdiff_t dstStride); 935 936 /* 937 Calculates dot product 938 */ 939 f64 dotProduct(const Size2D &size, 940 const u8 * src0Base, ptrdiff_t src0Stride, 941 const u8 * src1Base, ptrdiff_t src1Stride); 942 943 f64 dotProduct(const Size2D &size, 944 const s8 * src0Base, ptrdiff_t src0Stride, 945 const s8 * src1Base, ptrdiff_t src1Stride); 946 947 f64 dotProduct(const Size2D &size, 948 const f32 * src0Base, ptrdiff_t src0Stride, 949 const f32 * src1Base, ptrdiff_t src1Stride); 950 951 /* 952 Calculates mean and stddev 953 */ 954 void meanStdDev(const Size2D &size, 955 const u8 * srcBase, ptrdiff_t srcStride, 956 f32 * pMean, f32 * pStdDev); 957 958 void meanStdDev(const Size2D &size, 959 const u16 * srcBase, ptrdiff_t srcStride, 960 f32 * pMean, f32 * pStdDev); 961 962 /* 963 For each point `p` within `size`, do: 964 dst[p] = sqrt(src0[p] ^ 2 + src1[p] ^ 2) 965 */ 966 void magnitude(const Size2D &size, 967 const s16 *src0Base, ptrdiff_t src0Stride, 968 const s16 *src1Base, ptrdiff_t src1Stride, 969 s16 *dstBase, ptrdiff_t dstStride); 970 971 void magnitude(const Size2D &size, 972 const f32 *src0Base, ptrdiff_t src0Stride, 973 const f32 *src1Base, ptrdiff_t src1Stride, 974 f32 *dstBase, ptrdiff_t dstStride); 975 976 /* 977 Compute an integral image 978 */ 979 void integral(const Size2D &size, 980 const u8 * srcBase, ptrdiff_t srcStride, 981 u32 * sumBase, ptrdiff_t sumStride); 982 983 /* 984 Compute an integral of squared image values 985 */ 986 void sqrIntegral(const Size2D &size, 987 const u8 * srcBase, ptrdiff_t srcStride, 988 f64 * sqsumBase, ptrdiff_t sqsumStride); 989 990 /* 991 Among each pixel `p` within `src` find min and max values 992 */ 993 void minMaxVals(const Size2D &size, 994 const u8 *srcBase, ptrdiff_t srcStride, 995 u8 * minVal, u8 * maxVal); 996 997 void minMaxVals(const Size2D &size, 998 const s16 *srcBase, ptrdiff_t srcStride, 999 s16 * minVal, s16 * maxVal); 1000 1001 void minMaxVals(const Size2D &size, 1002 const u16 *srcBase, ptrdiff_t srcStride, 1003 u16 * minVal, u16 * maxVal); 1004 1005 void minMaxVals(const Size2D &size, 1006 const s32 *srcBase, ptrdiff_t srcStride, 1007 s32 * minVal, s32 * maxVal); 1008 1009 void minMaxVals(const Size2D &size, 1010 const u32 *srcBase, ptrdiff_t srcStride, 1011 u32 * minVal, u32 * maxVal); 1012 1013 /* 1014 Fill the arrays `minLocPtr`, `maxLocPtr` with locations of 1015 given values `minVal`, `maxVal` 1016 */ 1017 void fillMinMaxLocs(const Size2D & size, 1018 const u8 *srcBase, ptrdiff_t srcStride, 1019 u8 minVal, size_t * minLocPtr, s32 & minLocCount, s32 minLocCapacity, 1020 u8 maxVal, size_t * maxLocPtr, s32 & maxLocCount, s32 maxLocCapacity); 1021 1022 void fillMinMaxLocs(const Size2D & size, 1023 const u16 *srcBase, ptrdiff_t srcStride, 1024 u16 minVal, size_t * minLocPtr, s32 & minLocCount, s32 minLocCapacity, 1025 u16 maxVal, size_t * maxLocPtr, s32 & maxLocCount, s32 maxLocCapacity); 1026 1027 void fillMinMaxLocs(const Size2D & size, 1028 const s16 *srcBase, ptrdiff_t srcStride, 1029 s16 minVal, size_t * minLocPtr, s32 & minLocCount, s32 minLocCapacity, 1030 s16 maxVal, size_t * maxLocPtr, s32 & maxLocCount, s32 maxLocCapacity); 1031 1032 void fillMinMaxLocs(const Size2D & size, 1033 const u32 *srcBase, ptrdiff_t srcStride, 1034 u32 minVal, size_t * minLocPtr, s32 & minLocCount, s32 minLocCapacity, 1035 u32 maxVal, size_t * maxLocPtr, s32 & maxLocCount, s32 maxLocCapacity); 1036 1037 void fillMinMaxLocs(const Size2D & size, 1038 const s32 *srcBase, ptrdiff_t srcStride, 1039 s32 minVal, size_t * minLocPtr, s32 & minLocCount, s32 minLocCapacity, 1040 s32 maxVal, size_t * maxLocPtr, s32 & maxLocCount, s32 maxLocCapacity); 1041 1042 /* 1043 Among each pixel `p` within `src` find min and max values and its first occurences 1044 */ 1045 void minMaxLoc(const Size2D &size, 1046 const s8 * srcBase, ptrdiff_t srcStride, 1047 s8 &minVal, size_t &minCol, size_t &minRow, 1048 s8 &maxVal, size_t &maxCol, size_t &maxRow); 1049 1050 void minMaxLoc(const Size2D &size, 1051 const u8 * srcBase, ptrdiff_t srcStride, 1052 u8 &minVal, size_t &minCol, size_t &minRow, 1053 u8 &maxVal, size_t &maxCol, size_t &maxRow); 1054 1055 void minMaxLoc(const Size2D &size, 1056 const s16 * srcBase, ptrdiff_t srcStride, 1057 s16 &minVal, size_t &minCol, size_t &minRow, 1058 s16 &maxVal, size_t &maxCol, size_t &maxRow); 1059 1060 void minMaxLoc(const Size2D &size, 1061 const u16 * srcBase, ptrdiff_t srcStride, 1062 u16 &minVal, size_t &minCol, size_t &minRow, 1063 u16 &maxVal, size_t &maxCol, size_t &maxRow); 1064 1065 void minMaxLoc(const Size2D &size, 1066 const s32 * srcBase, ptrdiff_t srcStride, 1067 s32 &minVal, size_t &minCol, size_t &minRow, 1068 s32 &maxVal, size_t &maxCol, size_t &maxRow); 1069 1070 void minMaxLoc(const Size2D &size, 1071 const f32 * srcBase, ptrdiff_t srcStride, 1072 f32 &minVal, size_t &minCol, size_t &minRow, 1073 f32 &maxVal, size_t &maxCol, size_t &maxRow); 1074 1075 void minMaxLoc(const Size2D &size, 1076 const f32 * srcBase, ptrdiff_t srcStride, 1077 const u8 * maskBase, ptrdiff_t maskStride, 1078 f32 &minVal, size_t &minCol, size_t &minRow, 1079 f32 &maxVal, size_t &maxCol, size_t &maxRow); 1080 1081 /* 1082 For each point `p` within `size`, do: 1083 dst[p] += src[p] 1084 */ 1085 void accumulate(const Size2D &size, 1086 const u8 *srcBase, ptrdiff_t srcStride, 1087 s16 *dstBase, ptrdiff_t dstStride); 1088 1089 /* 1090 For each point `p` within `size`, do: 1091 dst[p] = (dst[p] + ((src[p] ^ 2) >> shift)) 1092 */ 1093 void accumulateSquare(const Size2D &size, 1094 const u8 *srcBase, ptrdiff_t srcStride, 1095 s16 *dstBase, ptrdiff_t dstStride, 1096 u32 shift); 1097 1098 /* 1099 For each point `p` within `size`, do: 1100 dst[p] = (1 - alpha) * dst[p] + alpha * src[p] 1101 */ 1102 void accumulateWeighted(const Size2D &size, 1103 const u8 *srcBase, ptrdiff_t srcStride, 1104 u8 *dstBase, ptrdiff_t dstStride, 1105 f32 alpha); 1106 1107 /* 1108 orient[p] = atan2(src0[p], src1[p]) 1109 */ 1110 void phase(const Size2D &size, 1111 const s16 * src0Base, ptrdiff_t src0Stride, 1112 const s16 * src1Base, ptrdiff_t src1Stride, 1113 u8 * orientBase, ptrdiff_t orientStride); 1114 1115 void phase(const Size2D &size, 1116 const f32 * src0Base, ptrdiff_t src0Stride, 1117 const f32 * src1Base, ptrdiff_t src1Stride, 1118 f32 * orientBase, ptrdiff_t orientStride, 1119 f32 scale); 1120 1121 /* 1122 Combine 2 planes to a single one 1123 */ 1124 void combine2(const Size2D &size, 1125 const u8 * src0Base, ptrdiff_t src0Stride, 1126 const u8 * src1Base, ptrdiff_t src1Stride, 1127 u8 * dstBase, ptrdiff_t dstStride); 1128 1129 void combine2(const Size2D &size, 1130 const u16 * src0Base, ptrdiff_t src0Stride, 1131 const u16 * src1Base, ptrdiff_t src1Stride, 1132 u16 * dstBase, ptrdiff_t dstStride); 1133 1134 void combine2(const Size2D &size, 1135 const s32 * src0Base, ptrdiff_t src0Stride, 1136 const s32 * src1Base, ptrdiff_t src1Stride, 1137 s32 * dstBase, ptrdiff_t dstStride); 1138 1139 void combine2(const Size2D &size, 1140 const s64 * src0Base, ptrdiff_t src0Stride, 1141 const s64 * src1Base, ptrdiff_t src1Stride, 1142 s64 * dstBase, ptrdiff_t dstStride); 1143 1144 /* 1145 Combine 3 planes to a single one 1146 */ 1147 void combine3(const Size2D &size, 1148 const u8 * src0Base, ptrdiff_t src0Stride, 1149 const u8 * src1Base, ptrdiff_t src1Stride, 1150 const u8 * src2Base, ptrdiff_t src2Stride, 1151 u8 * dstBase, ptrdiff_t dstStride); 1152 1153 void combine3(const Size2D &size, 1154 const u16 * src0Base, ptrdiff_t src0Stride, 1155 const u16 * src1Base, ptrdiff_t src1Stride, 1156 const u16 * src2Base, ptrdiff_t src2Stride, 1157 u16 * dstBase, ptrdiff_t dstStride); 1158 1159 void combine3(const Size2D &size, 1160 const s32 * src0Base, ptrdiff_t src0Stride, 1161 const s32 * src1Base, ptrdiff_t src1Stride, 1162 const s32 * src2Base, ptrdiff_t src2Stride, 1163 s32 * dstBase, ptrdiff_t dstStride); 1164 1165 void combine3(const Size2D &size, 1166 const s64 * src0Base, ptrdiff_t src0Stride, 1167 const s64 * src1Base, ptrdiff_t src1Stride, 1168 const s64 * src2Base, ptrdiff_t src2Stride, 1169 s64 * dstBase, ptrdiff_t dstStride); 1170 1171 /* 1172 Combine 4 planes to a single one 1173 */ 1174 void combine4(const Size2D &size, 1175 const u8 * src0Base, ptrdiff_t src0Stride, 1176 const u8 * src1Base, ptrdiff_t src1Stride, 1177 const u8 * src2Base, ptrdiff_t src2Stride, 1178 const u8 * src3Base, ptrdiff_t src3Stride, 1179 u8 * dstBase, ptrdiff_t dstStride); 1180 1181 void combine4(const Size2D &size, 1182 const u16 * src0Base, ptrdiff_t src0Stride, 1183 const u16 * src1Base, ptrdiff_t src1Stride, 1184 const u16 * src2Base, ptrdiff_t src2Stride, 1185 const u16 * src3Base, ptrdiff_t src3Stride, 1186 u16 * dstBase, ptrdiff_t dstStride); 1187 1188 void combine4(const Size2D &size, 1189 const s32 * src0Base, ptrdiff_t src0Stride, 1190 const s32 * src1Base, ptrdiff_t src1Stride, 1191 const s32 * src2Base, ptrdiff_t src2Stride, 1192 const s32 * src3Base, ptrdiff_t src3Stride, 1193 s32 * dstBase, ptrdiff_t dstStride); 1194 1195 void combine4(const Size2D &size, 1196 const s64 * src0Base, ptrdiff_t src0Stride, 1197 const s64 * src1Base, ptrdiff_t src1Stride, 1198 const s64 * src2Base, ptrdiff_t src2Stride, 1199 const s64 * src3Base, ptrdiff_t src3Stride, 1200 s64 * dstBase, ptrdiff_t dstStride); 1201 1202 /* 1203 Combine 3 planes to YUYV one 1204 */ 1205 void combineYUYV(const Size2D &size, 1206 const u8 * srcyBase, ptrdiff_t srcyStride, 1207 const u8 * srcuBase, ptrdiff_t srcuStride, 1208 const u8 * srcvBase, ptrdiff_t srcvStride, 1209 u8 * dstBase, ptrdiff_t dstStride); 1210 1211 /* 1212 Combine 3 planes to UYVY one 1213 */ 1214 void combineUYVY(const Size2D &size, 1215 const u8 * srcyBase, ptrdiff_t srcyStride, 1216 const u8 * srcuBase, ptrdiff_t srcuStride, 1217 const u8 * srcvBase, ptrdiff_t srcvStride, 1218 u8 * dstBase, ptrdiff_t dstStride); 1219 1220 /* 1221 Convert RGB image to grayscale one 1222 */ 1223 void rgb2gray(const Size2D &size, COLOR_SPACE color_space, 1224 const u8 * srcBase, ptrdiff_t srcStride, 1225 u8 * dstBase, ptrdiff_t dstStride); 1226 1227 /* 1228 Convert RGBX image to grayscale one 1229 */ 1230 void rgbx2gray(const Size2D &size, COLOR_SPACE color_space, 1231 const u8 * srcBase, ptrdiff_t srcStride, 1232 u8 * dstBase, ptrdiff_t dstStride); 1233 1234 /* 1235 Convert BGR image to grayscale one 1236 */ 1237 void bgr2gray(const Size2D &size, COLOR_SPACE color_space, 1238 const u8 * srcBase, ptrdiff_t srcStride, 1239 u8 * dstBase, ptrdiff_t dstStride); 1240 1241 /* 1242 Convert BGRX image to grayscale one 1243 */ 1244 void bgrx2gray(const Size2D &size, COLOR_SPACE color_space, 1245 const u8 * srcBase, ptrdiff_t srcStride, 1246 u8 * dstBase, ptrdiff_t dstStride); 1247 1248 /* 1249 Convert grayscale image to RGB one 1250 */ 1251 void gray2rgb(const Size2D &size, 1252 const u8 * srcBase, ptrdiff_t srcStride, 1253 u8 * dstBase, ptrdiff_t dstStride); 1254 1255 /* 1256 Convert grayscale image to RGBX one 1257 */ 1258 void gray2rgbx(const Size2D &size, 1259 const u8 * srcBase, ptrdiff_t srcStride, 1260 u8 * dstBase, ptrdiff_t dstStride); 1261 1262 /* 1263 Convert RGB image to RGBX 1264 */ 1265 void rgb2rgbx(const Size2D &size, 1266 const u8 * srcBase, ptrdiff_t srcStride, 1267 u8 * dstBase, ptrdiff_t dstStride); 1268 1269 /* 1270 Convert RGBX image to RGB 1271 */ 1272 void rgbx2rgb(const Size2D &size, 1273 const u8 * srcBase, ptrdiff_t srcStride, 1274 u8 * dstBase, ptrdiff_t dstStride); 1275 1276 /* 1277 Convert RGB image to BGR 1278 */ 1279 void rgb2bgr(const Size2D &size, 1280 const u8 * srcBase, ptrdiff_t srcStride, 1281 u8 * dstBase, ptrdiff_t dstStride); 1282 1283 /* 1284 Convert RGBX image to BGRX 1285 */ 1286 void rgbx2bgrx(const Size2D &size, 1287 const u8 * srcBase, ptrdiff_t srcStride, 1288 u8 * dstBase, ptrdiff_t dstStride); 1289 1290 /* 1291 Convert RGBX image to BGR 1292 */ 1293 void rgbx2bgr(const Size2D &size, 1294 const u8 * srcBase, ptrdiff_t srcStride, 1295 u8 * dstBase, ptrdiff_t dstStride); 1296 1297 /* 1298 Convert RGB image to BGRX 1299 */ 1300 void rgb2bgrx(const Size2D &size, 1301 const u8 * srcBase, ptrdiff_t srcStride, 1302 u8 * dstBase, ptrdiff_t dstStride); 1303 1304 /* 1305 Convert RGB image to HSV 1306 */ 1307 void rgb2hsv(const Size2D &size, 1308 const u8 * srcBase, ptrdiff_t srcStride, 1309 u8 * dstBase, ptrdiff_t dstStride, 1310 s32 hrange); 1311 1312 /* 1313 Convert RGBX image to HSV 1314 */ 1315 void rgbx2hsv(const Size2D &size, 1316 const u8 * srcBase, ptrdiff_t srcStride, 1317 u8 * dstBase, ptrdiff_t dstStride, 1318 s32 hrange); 1319 1320 /* 1321 Convert BGR image to HSV 1322 */ 1323 void bgr2hsv(const Size2D &size, 1324 const u8 * srcBase, ptrdiff_t srcStride, 1325 u8 * dstBase, ptrdiff_t dstStride, 1326 s32 hrange); 1327 1328 /* 1329 Convert BGRX image to HSV 1330 */ 1331 void bgrx2hsv(const Size2D &size, 1332 const u8 * srcBase, ptrdiff_t srcStride, 1333 u8 * dstBase, ptrdiff_t dstStride, 1334 s32 hrange); 1335 1336 /* 1337 Convert RGBX image to BGR565 1338 RRRRrrrr GGGGgggg BBBBbbbb XXXXxxxx -> GggBBBBb RRRRrGGG 1339 */ 1340 void rgbx2bgr565(const Size2D &size, 1341 const u8 * srcBase, ptrdiff_t srcStride, 1342 u8 * dstBase, ptrdiff_t dstStride); 1343 1344 /* 1345 Convert RGB image to BGR565 1346 RRRRrrrr GGGGgggg BBBBbbbb -> GggBBBBb RRRRrGGG 1347 */ 1348 void rgb2bgr565(const Size2D &size, 1349 const u8 * srcBase, ptrdiff_t srcStride, 1350 u8 * dstBase, ptrdiff_t dstStride); 1351 1352 /* 1353 Convert RGBX image to RGB565 1354 RRRRrrrr GGGGgggg BBBBbbbb XXXXxxxx -> GggRRRRr BBBBbGGG 1355 */ 1356 void rgbx2rgb565(const Size2D &size, 1357 const u8 * srcBase, ptrdiff_t srcStride, 1358 u8 * dstBase, ptrdiff_t dstStride); 1359 1360 /* 1361 Convert RGB image to RGB565 1362 RRRRrrrr GGGGgggg BBBBbbbb -> GggRRRRr BBBBbGGG 1363 */ 1364 void rgb2rgb565(const Size2D &size, 1365 const u8 * srcBase, ptrdiff_t srcStride, 1366 u8 * dstBase, ptrdiff_t dstStride); 1367 1368 /* 1369 Convert RGB image to YCrCb 1370 */ 1371 void rgb2ycrcb(const Size2D &size, 1372 const u8 * srcBase, ptrdiff_t srcStride, 1373 u8 * dstBase, ptrdiff_t dstStride); 1374 1375 /* 1376 Convert RGBX image to YCrCb 1377 */ 1378 void rgbx2ycrcb(const Size2D &size, 1379 const u8 * srcBase, ptrdiff_t srcStride, 1380 u8 * dstBase, ptrdiff_t dstStride); 1381 1382 /* 1383 Convert BGR image to YCrCb 1384 */ 1385 void bgr2ycrcb(const Size2D &size, 1386 const u8 * srcBase, ptrdiff_t srcStride, 1387 u8 * dstBase, ptrdiff_t dstStride); 1388 1389 /* 1390 Convert BGRX image to YCrCb 1391 */ 1392 void bgrx2ycrcb(const Size2D &size, 1393 const u8 * srcBase, ptrdiff_t srcStride, 1394 u8 * dstBase, ptrdiff_t dstStride); 1395 1396 /* 1397 Convert YUV420sp image to RGB 1398 */ 1399 void yuv420sp2rgb(const Size2D &size, 1400 const u8 * yBase, ptrdiff_t yStride, 1401 const u8 * uvBase, ptrdiff_t uvStride, 1402 u8 * dstBase, ptrdiff_t dstStride); 1403 1404 /* 1405 Convert YUV420sp image to RGBX 1406 */ 1407 void yuv420sp2rgbx(const Size2D &size, 1408 const u8 * yBase, ptrdiff_t yStride, 1409 const u8 * uvBase, ptrdiff_t uvStride, 1410 u8 * dstBase, ptrdiff_t dstStride); 1411 1412 /* 1413 Convert YUV420i image to RGB 1414 */ 1415 void yuv420i2rgb(const Size2D &size, 1416 const u8 * yBase, ptrdiff_t yStride, 1417 const u8 * uvBase, ptrdiff_t uvStride, 1418 u8 * dstBase, ptrdiff_t dstStride); 1419 1420 /* 1421 Convert YUV420i image to RGBX 1422 */ 1423 void yuv420i2rgbx(const Size2D &size, 1424 const u8 * yBase, ptrdiff_t yStride, 1425 const u8 * uvBase, ptrdiff_t uvStride, 1426 u8 * dstBase, ptrdiff_t dstStride); 1427 1428 /* 1429 Convert YUV420sp image to BGR 1430 */ 1431 void yuv420sp2bgr(const Size2D &size, 1432 const u8 * yBase, ptrdiff_t yStride, 1433 const u8 * uvBase, ptrdiff_t uvStride, 1434 u8 * dstBase, ptrdiff_t dstStride); 1435 1436 /* 1437 Convert YUV420sp image to BGRX 1438 */ 1439 void yuv420sp2bgrx(const Size2D &size, 1440 const u8 * yBase, ptrdiff_t yStride, 1441 const u8 * uvBase, ptrdiff_t uvStride, 1442 u8 * dstBase, ptrdiff_t dstStride); 1443 1444 /* 1445 Convert YUV420i image to BGR 1446 */ 1447 void yuv420i2bgr(const Size2D &size, 1448 const u8 * yBase, ptrdiff_t yStride, 1449 const u8 * uvBase, ptrdiff_t uvStride, 1450 u8 * dstBase, ptrdiff_t dstStride); 1451 1452 /* 1453 Convert YUV420i image to BGRX 1454 */ 1455 void yuv420i2bgrx(const Size2D &size, 1456 const u8 * yBase, ptrdiff_t yStride, 1457 const u8 * uvBase, ptrdiff_t uvStride, 1458 u8 * dstBase, ptrdiff_t dstStride); 1459 1460 /* 1461 For each point `p` within `size`, do: 1462 dst[p] = src[p] << shift 1463 */ 1464 void lshift(const Size2D &size, 1465 const u8 * srcBase, ptrdiff_t srcStride, 1466 s16 * dstBase, ptrdiff_t dstStride, 1467 u32 shift); 1468 1469 /* 1470 For each point `p` within `size`, do sign-extending shift: 1471 dst[p] = src[p] >> shift 1472 */ 1473 void rshift(const Size2D &size, 1474 const s16 * srcBase, ptrdiff_t srcStride, 1475 u8 * dstBase, ptrdiff_t dstStride, 1476 u32 shift, CONVERT_POLICY cpolicy); 1477 1478 /* 1479 For each point `p` within `size`, set `dst[p]` to the average 1480 of `src[p]` and the 8 (or 24 for blur5x5) points around it 1481 NOTE: the function cannot operate inplace 1482 */ 1483 bool isBlur3x3Supported(const Size2D &size, BORDER_MODE border); 1484 void blur3x3(const Size2D &size, 1485 const u8 * srcBase, ptrdiff_t srcStride, 1486 u8 * dstBase, ptrdiff_t dstStride, 1487 BORDER_MODE border, u8 borderValue); 1488 1489 bool isBlurU8Supported(const Size2D &size, s32 cn, BORDER_MODE border); 1490 void blur3x3(const Size2D &size, s32 cn, 1491 const u8 * srcBase, ptrdiff_t srcStride, 1492 u8 * dstBase, ptrdiff_t dstStride, 1493 BORDER_MODE borderType, u8 borderValue); 1494 1495 void blur5x5(const Size2D &size, s32 cn, 1496 const u8 * srcBase, ptrdiff_t srcStride, 1497 u8 * dstBase, ptrdiff_t dstStride, 1498 BORDER_MODE borderType, u8 borderValue); 1499 1500 /* 1501 For each point `p` within `size`, set `dst[p]` to the average 1502 of `src[p]` and the 8 points around it 1503 NOTE: the function can operate inplace 1504 */ 1505 bool isBlurF32Supported(const Size2D &size, s32 cn, BORDER_MODE border); 1506 void blur3x3(const Size2D &size, s32 cn, 1507 const f32 * srcBase, ptrdiff_t srcStride, 1508 f32 * dstBase, ptrdiff_t dstStride, 1509 BORDER_MODE borderType, f32 borderValue, Margin borderMargin); 1510 1511 bool isBlurS32Supported(const Size2D &size, s32 cn, BORDER_MODE border); 1512 void blur3x3(const Size2D &size, s32 cn, 1513 const s32 * srcBase, ptrdiff_t srcStride, 1514 s32 * dstBase, ptrdiff_t dstStride, 1515 BORDER_MODE borderType, s32 borderValue, Margin borderMargin); 1516 1517 /* 1518 For each point `p` within `size`, set `dst[p]` to gaussian smooth 1519 of `src[p]` and the 8(24 for 5x5 version) points around it 1520 NOTE: the function cannot operate inplace 1521 */ 1522 bool isGaussianBlur3x3Supported(const Size2D &size, BORDER_MODE border); 1523 void gaussianBlur3x3(const Size2D &size, 1524 const u8 * srcBase, ptrdiff_t srcStride, 1525 u8 * dstBase, ptrdiff_t dstStride, 1526 BORDER_MODE border, u8 borderValue); 1527 bool isGaussianBlur3x3MarginSupported(const Size2D &size, BORDER_MODE border, Margin borderMargin = Margin()); 1528 void gaussianBlur3x3Margin(const Size2D &size, 1529 const u8 * srcBase, ptrdiff_t srcStride, 1530 u8 * dstBase, ptrdiff_t dstStride, 1531 BORDER_MODE border, u8 borderValue, Margin borderMargin = Margin()); 1532 1533 bool isGaussianBlur5x5Supported(const Size2D &size, s32 cn, BORDER_MODE border); 1534 void gaussianBlur5x5(const Size2D &size, s32 cn, 1535 const u8 * srcBase, ptrdiff_t srcStride, 1536 u8 * dstBase, ptrdiff_t dstStride, 1537 BORDER_MODE borderType, u8 borderValue, Margin borderMargin); 1538 1539 void gaussianBlur5x5(const Size2D &size, s32 cn, 1540 const u16 * srcBase, ptrdiff_t srcStride, 1541 u16 * dstBase, ptrdiff_t dstStride, 1542 BORDER_MODE borderType, u16 borderValue, Margin borderMargin); 1543 1544 void gaussianBlur5x5(const Size2D &size, s32 cn, 1545 const s16 * srcBase, ptrdiff_t srcStride, 1546 s16 * dstBase, ptrdiff_t dstStride, 1547 BORDER_MODE borderType, s16 borderValue, Margin borderMargin); 1548 1549 void gaussianBlur5x5(const Size2D &size, s32 cn, 1550 const s32 * srcBase, ptrdiff_t srcStride, 1551 s32 * dstBase, ptrdiff_t dstStride, 1552 BORDER_MODE borderType, s32 borderValue, Margin borderMargin); 1553 1554 /* 1555 Calculation of Sobel operator 1556 NOTE: the function cannot operate inplace 1557 */ 1558 bool isSobel3x3Supported(const Size2D &size, BORDER_MODE border, s32 dx, s32 dy, Margin borderMargin = Margin()); 1559 void Sobel3x3(const Size2D &size, 1560 const u8 * srcBase, ptrdiff_t srcStride, 1561 s16 * dstBase, ptrdiff_t dstStride, 1562 s32 dx, s32 dy, 1563 BORDER_MODE border, u8 borderValue, Margin borderMargin = Margin()); 1564 1565 /* 1566 Calculation of Sobel operator for f32 data 1567 NOTE: the function can operate inplace 1568 */ 1569 bool isSobel3x3f32Supported(const Size2D &size, BORDER_MODE border, s32 dx, s32 dy); 1570 void Sobel3x3(const Size2D &size, 1571 const f32 * srcBase, ptrdiff_t srcStride, 1572 f32 * dstBase, ptrdiff_t dstStride, 1573 s32 dx, s32 dy, 1574 BORDER_MODE borderType, f32 borderValue); 1575 1576 /* 1577 Calculation of Scharr operator 1578 NOTE: the function cannot operate inplace 1579 */ 1580 bool isScharr3x3Supported(const Size2D &size, BORDER_MODE border, s32 dx, s32 dy, Margin borderMargin = Margin()); 1581 void Scharr3x3(const Size2D &size, 1582 const u8 * srcBase, ptrdiff_t srcStride, 1583 s16 * dstBase, ptrdiff_t dstStride, 1584 s32 dx, s32 dy, 1585 BORDER_MODE borderType, u8 borderValue, Margin borderMargin = Margin()); 1586 1587 void ScharrDeriv(const Size2D &size, s32 cn, 1588 const u8 * srcBase, ptrdiff_t srcStride, 1589 s16 * dstBase, ptrdiff_t dstStride); 1590 1591 /* 1592 Calculation of generic separable filtering operator 1593 rowFilter/colFilter define filter weights 1594 0 - predefined 1 2 1 1595 1 - predefined -1 0 1 1596 2 - predefined 1 -2 1 1597 3 - weights provided as xw/yw 1598 */ 1599 bool isSeparableFilter3x3Supported(const Size2D &size, BORDER_MODE border, s32 dx, s32 dy, Margin borderMargin = Margin()); 1600 void SeparableFilter3x3(const Size2D &size, 1601 const u8 * srcBase, ptrdiff_t srcStride, 1602 s16 * dstBase, ptrdiff_t dstStride, 1603 const u8 rowFilter, const u8 colFilter, const s16 *xw, const s16 *yw, 1604 BORDER_MODE border, u8 borderValue, Margin borderMargin = Margin()); 1605 1606 /* 1607 Extract a single plane from 2 channel image 1608 */ 1609 void extract2(const Size2D &size, 1610 const u8 * srcBase, ptrdiff_t srcStride, 1611 u8 * dstBase, ptrdiff_t dstStride, 1612 u32 coi); 1613 1614 /* 1615 Extract a single plane from 3 channel image 1616 */ 1617 void extract3(const Size2D &size, 1618 const u8 * srcBase, ptrdiff_t srcStride, 1619 u8 * dstBase, ptrdiff_t dstStride, 1620 u32 coi); 1621 1622 /* 1623 Extract a single plane from 4 channel image 1624 */ 1625 void extract4(const Size2D &size, 1626 const u8 * srcBase, ptrdiff_t srcStride, 1627 u8 * dstBase, ptrdiff_t dstStride, 1628 u32 coi); 1629 1630 /* 1631 Split 2 channel image to separate planes 1632 */ 1633 void split2(const Size2D &size, 1634 const u8 * srcBase, ptrdiff_t srcStride, 1635 u8 * dst0Base, ptrdiff_t dst0Stride, 1636 u8 * dst1Base, ptrdiff_t dst1Stride); 1637 1638 void split2(const Size2D &size, 1639 const u16* srcBase, ptrdiff_t srcStride, 1640 u16 * dst0Base, ptrdiff_t dst0Stride, 1641 u16 * dst1Base, ptrdiff_t dst1Stride); 1642 1643 void split2(const Size2D &size, 1644 const s32 * srcBase, ptrdiff_t srcStride, 1645 s32 * dst0Base, ptrdiff_t dst0Stride, 1646 s32 * dst1Base, ptrdiff_t dst1Stride); 1647 1648 void split2(const Size2D &size, 1649 const s64 * srcBase, ptrdiff_t srcStride, 1650 s64 * dst0Base, ptrdiff_t dst0Stride, 1651 s64 * dst1Base, ptrdiff_t dst1Stride); 1652 1653 /* 1654 Split 3 channel image to separate planes 1655 */ 1656 void split3(const Size2D &size, 1657 const u8 * srcBase, ptrdiff_t srcStride, 1658 u8 * dst0Base, ptrdiff_t dst0Stride, 1659 u8 * dst1Base, ptrdiff_t dst1Stride, 1660 u8 * dst2Base, ptrdiff_t dst2Stride); 1661 1662 void split3(const Size2D &size, 1663 const u16* srcBase, ptrdiff_t srcStride, 1664 u16 * dst0Base, ptrdiff_t dst0Stride, 1665 u16 * dst1Base, ptrdiff_t dst1Stride, 1666 u16 * dst2Base, ptrdiff_t dst2Stride); 1667 1668 void split3(const Size2D &size, 1669 const s32 * srcBase, ptrdiff_t srcStride, 1670 s32 * dst0Base, ptrdiff_t dst0Stride, 1671 s32 * dst1Base, ptrdiff_t dst1Stride, 1672 s32 * dst2Base, ptrdiff_t dst2Stride); 1673 1674 void split3(const Size2D &size, 1675 const s64 * srcBase, ptrdiff_t srcStride, 1676 s64 * dst0Base, ptrdiff_t dst0Stride, 1677 s64 * dst1Base, ptrdiff_t dst1Stride, 1678 s64 * dst2Base, ptrdiff_t dst2Stride); 1679 1680 /* 1681 Split 4 channel image to separate planes 1682 */ 1683 void split4(const Size2D &size, 1684 const u8 * srcBase, ptrdiff_t srcStride, 1685 u8 * dst0Base, ptrdiff_t dst0Stride, 1686 u8 * dst1Base, ptrdiff_t dst1Stride, 1687 u8 * dst2Base, ptrdiff_t dst2Stride, 1688 u8 * dst3Base, ptrdiff_t dst3Stride); 1689 1690 void split4(const Size2D &size, 1691 const u16* srcBase, ptrdiff_t srcStride, 1692 u16 * dst0Base, ptrdiff_t dst0Stride, 1693 u16 * dst1Base, ptrdiff_t dst1Stride, 1694 u16 * dst2Base, ptrdiff_t dst2Stride, 1695 u16 * dst3Base, ptrdiff_t dst3Stride); 1696 1697 void split4(const Size2D &size, 1698 const s32 * srcBase, ptrdiff_t srcStride, 1699 s32 * dst0Base, ptrdiff_t dst0Stride, 1700 s32 * dst1Base, ptrdiff_t dst1Stride, 1701 s32 * dst2Base, ptrdiff_t dst2Stride, 1702 s32 * dst3Base, ptrdiff_t dst3Stride); 1703 1704 void split4(const Size2D &size, 1705 const s64 * srcBase, ptrdiff_t srcStride, 1706 s64 * dst0Base, ptrdiff_t dst0Stride, 1707 s64 * dst1Base, ptrdiff_t dst1Stride, 1708 s64 * dst2Base, ptrdiff_t dst2Stride, 1709 s64 * dst3Base, ptrdiff_t dst3Stride); 1710 1711 /* 1712 Split 4 channel image to 3 channel image and 1 channel image 1713 */ 1714 void split4(const Size2D &size, 1715 const u8 * srcBase, ptrdiff_t srcStride, 1716 u8 * dst3Base, ptrdiff_t dst3Stride, 1717 u8 * dst1Base, ptrdiff_t dst1Stride); 1718 1719 /* 1720 Flip image using specified flip mode 1721 */ 1722 bool isFlipSupported(FLIP_MODE flipMode, u32 elemSize); 1723 void flip(const Size2D &size, 1724 const u8 * srcBase, ptrdiff_t srcStride, 1725 u8 * dstBase, ptrdiff_t dstStride, 1726 FLIP_MODE flipMode, u32 elemSize); 1727 1728 /* 1729 For each point `p` within `size`, set `dst[p]` to the maximum 1730 of `src[p]` and the 8 points around it 1731 NOTE: the function cannot operate inplace 1732 */ 1733 bool isMorph3x3Supported(const Size2D &size, BORDER_MODE border); 1734 1735 void erode3x3(const Size2D &size, 1736 const u8 * srcBase, ptrdiff_t srcStride, 1737 u8 * dstBase, ptrdiff_t dstStride, 1738 BORDER_MODE border, u8 borderValue); 1739 1740 void dilate3x3(const Size2D &size, 1741 const u8 * srcBase, ptrdiff_t srcStride, 1742 u8 * dstBase, ptrdiff_t dstStride, 1743 BORDER_MODE border, u8 borderValue); 1744 1745 void erode(const Size2D &ssize, u32 cn, 1746 const u8 * srcBase, ptrdiff_t srcStride, 1747 u8 * dstBase, ptrdiff_t dstStride, 1748 const Size2D &ksize, 1749 size_t anchorX, size_t anchorY, 1750 BORDER_MODE rowBorderType, BORDER_MODE columnBorderType, 1751 const u8 * borderValues, Margin borderMargin); 1752 1753 void dilate(const Size2D &ssize, u32 cn, 1754 const u8 * srcBase, ptrdiff_t srcStride, 1755 u8 * dstBase, ptrdiff_t dstStride, 1756 const Size2D &ksize, 1757 size_t anchorX, size_t anchorY, 1758 BORDER_MODE rowBorderType, BORDER_MODE columnBorderType, 1759 const u8 * borderValues, Margin borderMargin); 1760 1761 /* 1762 Resize a source image using "nearest neighbor" interpolation type 1763 1764 wr = src_width / dst_width 1765 hr = src_height / dst_height 1766 */ 1767 bool isResizeNearestNeighborSupported(const Size2D &ssize, u32 elemSize); 1768 void resizeNearestNeighbor(const Size2D &ssize, const Size2D &dsize, 1769 const void * srcBase, ptrdiff_t srcStride, 1770 void * dstBase, ptrdiff_t dstStride, 1771 f32 wr, f32 hr, u32 elemSize); 1772 1773 /* 1774 Resize a source image using "area" interpolation type 1775 1776 wr = src_width / dst_width 1777 hr = src_height / dst_height 1778 */ 1779 bool isResizeAreaSupported(f32 wr, f32 hr, u32 channels); 1780 void resizeAreaOpenCV(const Size2D &ssize, const Size2D &dsize, 1781 const u8 * srcBase, ptrdiff_t srcStride, 1782 u8 * dstBase, ptrdiff_t dstStride, 1783 f32 wr, f32 hr, u32 channels); 1784 void resizeArea(const Size2D &ssize, const Size2D &dsize, 1785 const u8 * srcBase, ptrdiff_t srcStride, 1786 u8 * dstBase, ptrdiff_t dstStride, 1787 f32 wr, f32 hr, u32 channels); 1788 1789 /* 1790 Resize a source image using "linear" interpolation type 1791 1792 wr = src_width / dst_width 1793 hr = src_height / dst_height 1794 */ 1795 bool isResizeLinearOpenCVSupported(const Size2D &ssize, const Size2D &dsize, u32 channels); 1796 bool isResizeLinearSupported(const Size2D &ssize, const Size2D &dsize, 1797 f32 wr, f32 hr, u32 channels); 1798 void resizeLinearOpenCV(const Size2D &ssize, const Size2D &dsize, 1799 const u8 * srcBase, ptrdiff_t srcStride, 1800 u8 * dstBase, ptrdiff_t dstStride, 1801 f32 wr, f32 hr, u32 channels); 1802 void resizeLinear(const Size2D &ssize, const Size2D &dsize, 1803 const u8 * srcBase, ptrdiff_t srcStride, 1804 u8 * dstBase, ptrdiff_t dstStride, 1805 f32 wr, f32 hr, u32 channels); 1806 1807 /* 1808 For each point `p` within `size`, set `dst[p]` to convolution 1809 of `src[p]` and the (ksize * ksize - 1) points around it 1810 The function uses OpenVX semantic (so, in order to use this function 1811 in OpenCV you should flip kernel in both directions) 1812 NOTE: the function cannot operate inplace 1813 */ 1814 bool isConvolutionSupported(const Size2D &size, const Size2D &ksize, BORDER_MODE border); 1815 void convolution(const Size2D &size, 1816 const u8 * srcBase, ptrdiff_t srcStride, 1817 u8 * dstBase, ptrdiff_t dstStride, 1818 BORDER_MODE border, u8 borderValue, 1819 const Size2D & ksize, s16 * kernelBase, u32 scale); 1820 1821 /* 1822 For each point `p` within `dstSize`, does convolution 1823 of tmpl points and size*size square of src points starting with `src[p]`. 1824 Src should be of size (dstSize+size-1)*(dstSize+size-1) 1825 NOTE: the function cannot operate inplace 1826 */ 1827 bool isMatchTemplateSupported(const Size2D &tmplSize); 1828 void matchTemplate(const Size2D &srcSize, 1829 const u8 * srcBase, ptrdiff_t srcStride, 1830 const Size2D &tmplSize, 1831 const u8 * tmplBase, ptrdiff_t tmplStride, 1832 f32 * dstBase, ptrdiff_t dstStride, 1833 bool normalize); 1834 1835 /* 1836 Calculation of Laplacian operator 1837 1838 1 1 1 1839 1 -8 1 1840 1 1 1 1841 1842 NOTE: the function cannot operate inplace 1843 */ 1844 bool isLaplacian3x3Supported(const Size2D &size, BORDER_MODE border); 1845 void Laplacian3x3(const Size2D &size, 1846 const u8 * srcBase, ptrdiff_t srcStride, 1847 u8 * dstBase, ptrdiff_t dstStride, 1848 BORDER_MODE border, u8 borderValue); 1849 1850 /* 1851 OpenCV like calculation of Laplacian operator 1852 1853 kernel 1 kernel 3 kernel 5 1854 0 1 0 2 0 2 1 2 2 2 1 1855 1 -4 1 0 -8 0 2 0 -4 0 2 1856 0 1 0 2 0 2 2 -4 -12 -4 2 1857 2 0 -4 0 2 1858 1 2 2 2 1 1859 1860 NOTE: the function cannot operate inplace 1861 */ 1862 bool isLaplacianOpenCVSupported(const Size2D &size, BORDER_MODE border); 1863 void Laplacian1OpenCV(const Size2D &size, 1864 const u8 * srcBase, ptrdiff_t srcStride, 1865 s16 * dstBase, ptrdiff_t dstStride, 1866 BORDER_MODE border, u8 borderValue); 1867 void Laplacian3OpenCV(const Size2D &size, 1868 const u8 * srcBase, ptrdiff_t srcStride, 1869 s16 * dstBase, ptrdiff_t dstStride, 1870 BORDER_MODE border, u8 borderValue); 1871 void Laplacian5OpenCV(const Size2D &size, 1872 const u8 * srcBase, ptrdiff_t srcStride, 1873 s16 * dstBase, ptrdiff_t dstStride, 1874 BORDER_MODE border, u8 borderValue); 1875 1876 /* 1877 Detect image edges using Canny algorithm 1878 These functions perform derivatives estimation using sobel algorithm 1879 */ 1880 bool isCanny3x3Supported(const Size2D &size); 1881 void Canny3x3L1(const Size2D &size, 1882 const u8 * srcBase, ptrdiff_t srcStride, 1883 u8 * dstBase, ptrdiff_t dstStride, 1884 f64 low_thresh, f64 high_thresh, 1885 Margin borderMargin); 1886 1887 void Canny3x3L2(const Size2D &size, 1888 const u8 * srcBase, ptrdiff_t srcStride, 1889 u8 * dstBase, ptrdiff_t dstStride, 1890 f64 low_thresh, f64 high_thresh, 1891 Margin borderMargin); 1892 1893 /* 1894 Detect image edges using Canny algorithm 1895 These functions don't estimate derivatives and thus require 1896 precomputed derivatives estimation instead of source image 1897 */ 1898 void Canny3x3L1(const Size2D &size, s32 cn, 1899 s16 * dxBase, ptrdiff_t dxStride, 1900 s16 * dyBase, ptrdiff_t dyStride, 1901 u8 * dstBase, ptrdiff_t dstStride, 1902 f64 low_thresh, f64 high_thresh); 1903 1904 void Canny3x3L2(const Size2D &size, s32 cn, 1905 s16 * dxBase, ptrdiff_t dxStride, 1906 s16 * dyBase, ptrdiff_t dyStride, 1907 u8 * dstBase, ptrdiff_t dstStride, 1908 f64 low_thresh, f64 high_thresh); 1909 1910 /* 1911 Performs detection of FAST features 1912 */ 1913 void FAST(const Size2D &size, 1914 u8 *srcBase, ptrdiff_t srcStride, 1915 KeypointStore *keypoints, 1916 u8 threshold, bool nonmax_suppression); 1917 1918 /* 1919 Remap a source image using table and specified 1920 extrapolation method 1921 */ 1922 bool isRemapNearestNeighborSupported(const Size2D &ssize); 1923 void remapNearestNeighbor(const Size2D &ssize, const Size2D &dsize, 1924 const u8 * srcBase, ptrdiff_t srcStride, 1925 const f32 * tableBase, ptrdiff_t tableStride, 1926 u8 * dstBase, ptrdiff_t dstStride, 1927 BORDER_MODE borderMode, u8 borderValue); 1928 1929 bool isRemapLinearSupported(const Size2D &ssize); 1930 void remapLinear(const Size2D &ssize, const Size2D &dsize, 1931 const u8 * srcBase, ptrdiff_t srcStride, 1932 const f32 * tableBase, ptrdiff_t tableStride, 1933 u8 * dstBase, ptrdiff_t dstStride, 1934 BORDER_MODE borderMode, u8 borderValue); 1935 1936 /* 1937 Perform an affine transform on an input image 1938 1939 src_x = dst_x * m[0] + dst_y * m[2] + m[4] 1940 src_y = dst_x * m[1] + dst_y * m[3] + m[5] 1941 */ 1942 bool isWarpAffineNearestNeighborSupported(const Size2D &ssize); 1943 void warpAffineNearestNeighbor(const Size2D &ssize, const Size2D &dsize, 1944 const u8 * srcBase, ptrdiff_t srcStride, 1945 const f32 * m, 1946 u8 * dstBase, ptrdiff_t dstStride, 1947 BORDER_MODE borderMode, u8 borderValue); 1948 1949 bool isWarpAffineLinearSupported(const Size2D &ssize); 1950 void warpAffineLinear(const Size2D &ssize, const Size2D &dsize, 1951 const u8 * srcBase, ptrdiff_t srcStride, 1952 const f32 * m, 1953 u8 * dstBase, ptrdiff_t dstStride, 1954 BORDER_MODE borderMode, u8 borderValue); 1955 1956 /* 1957 Perform a perspective transform on an input image 1958 1959 src_x = dst_x * m[0] + dst_y * m[3] + m[6] 1960 src_y = dst_x * m[1] + dst_y * m[4] + m[7] 1961 w = dst_x * m[2] + dst_y * m[5] + m[8] 1962 1963 src_x = w == 0 ? 0 : src_x / w 1964 src_y = w == 0 ? 0 : src_y / w 1965 */ 1966 bool isWarpPerspectiveNearestNeighborSupported(const Size2D &ssize); 1967 void warpPerspectiveNearestNeighbor(const Size2D &ssize, const Size2D &dsize, 1968 const u8 * srcBase, ptrdiff_t srcStride, 1969 const f32 * m, 1970 u8 * dstBase, ptrdiff_t dstStride, 1971 BORDER_MODE borderMode, u8 borderValue); 1972 1973 bool isWarpPerspectiveLinearSupported(const Size2D &ssize); 1974 void warpPerspectiveLinear(const Size2D &ssize, const Size2D &dsize, 1975 const u8 * srcBase, ptrdiff_t srcStride, 1976 const f32 * m, 1977 u8 * dstBase, ptrdiff_t dstStride, 1978 BORDER_MODE borderMode, u8 borderValue); 1979 1980 /* 1981 Convert data from source to destination type 1982 */ 1983 void convert(const Size2D &_size, 1984 const u8 * srcBase, ptrdiff_t srcStride, 1985 s8 * dstBase, ptrdiff_t dstStride); 1986 1987 void convert(const Size2D &_size, 1988 const u8 * srcBase, ptrdiff_t srcStride, 1989 u16 * dstBase, ptrdiff_t dstStride); 1990 1991 void convert(const Size2D &_size, 1992 const u8 * srcBase, ptrdiff_t srcStride, 1993 s16 * dstBase, ptrdiff_t dstStride); 1994 1995 void convert(const Size2D &_size, 1996 const u8 * srcBase, ptrdiff_t srcStride, 1997 s32 * dstBase, ptrdiff_t dstStride); 1998 1999 void convert(const Size2D &_size, 2000 const u8 * srcBase, ptrdiff_t srcStride, 2001 f32 * dstBase, ptrdiff_t dstStride); 2002 2003 void convert(const Size2D &_size, 2004 const s8 * srcBase, ptrdiff_t srcStride, 2005 u8 * dstBase, ptrdiff_t dstStride); 2006 2007 void convert(const Size2D &_size, 2008 const s8 * srcBase, ptrdiff_t srcStride, 2009 u16 * dstBase, ptrdiff_t dstStride); 2010 2011 void convert(const Size2D &_size, 2012 const s8 * srcBase, ptrdiff_t srcStride, 2013 s16 * dstBase, ptrdiff_t dstStride); 2014 2015 void convert(const Size2D &_size, 2016 const s8 * srcBase, ptrdiff_t srcStride, 2017 s32 * dstBase, ptrdiff_t dstStride); 2018 2019 void convert(const Size2D &_size, 2020 const s8 * srcBase, ptrdiff_t srcStride, 2021 f32 * dstBase, ptrdiff_t dstStride); 2022 2023 void convert(const Size2D &_size, 2024 const u16 * srcBase, ptrdiff_t srcStride, 2025 u8 * dstBase, ptrdiff_t dstStride); 2026 2027 void convert(const Size2D &_size, 2028 const u16 * srcBase, ptrdiff_t srcStride, 2029 s8 * dstBase, ptrdiff_t dstStride); 2030 2031 void convert(const Size2D &_size, 2032 const u16 * srcBase, ptrdiff_t srcStride, 2033 s16 * dstBase, ptrdiff_t dstStride); 2034 2035 void convert(const Size2D &_size, 2036 const u16 * srcBase, ptrdiff_t srcStride, 2037 s32 * dstBase, ptrdiff_t dstStride); 2038 2039 void convert(const Size2D &_size, 2040 const u16 * srcBase, ptrdiff_t srcStride, 2041 f32 * dstBase, ptrdiff_t dstStride); 2042 2043 void convert(const Size2D &_size, 2044 const s16 * srcBase, ptrdiff_t srcStride, 2045 u8 * dstBase, ptrdiff_t dstStride); 2046 2047 void convert(const Size2D &_size, 2048 const s16 * srcBase, ptrdiff_t srcStride, 2049 s8 * dstBase, ptrdiff_t dstStride); 2050 2051 void convert(const Size2D &_size, 2052 const s16 * srcBase, ptrdiff_t srcStride, 2053 u16 * dstBase, ptrdiff_t dstStride); 2054 2055 void convert(const Size2D &_size, 2056 const s16 * srcBase, ptrdiff_t srcStride, 2057 s32 * dstBase, ptrdiff_t dstStride); 2058 2059 void convert(const Size2D &_size, 2060 const s16 * srcBase, ptrdiff_t srcStride, 2061 f32 * dstBase, ptrdiff_t dstStride); 2062 2063 void convert(const Size2D &_size, 2064 const s32 * srcBase, ptrdiff_t srcStride, 2065 u8 * dstBase, ptrdiff_t dstStride); 2066 2067 void convert(const Size2D &_size, 2068 const s32 * srcBase, ptrdiff_t srcStride, 2069 s8 * dstBase, ptrdiff_t dstStride); 2070 2071 void convert(const Size2D &_size, 2072 const s32 * srcBase, ptrdiff_t srcStride, 2073 u16 * dstBase, ptrdiff_t dstStride); 2074 2075 void convert(const Size2D &_size, 2076 const s32 * srcBase, ptrdiff_t srcStride, 2077 s16 * dstBase, ptrdiff_t dstStride); 2078 2079 void convert(const Size2D &_size, 2080 const s32 * srcBase, ptrdiff_t srcStride, 2081 f32 * dstBase, ptrdiff_t dstStride); 2082 2083 void convert(const Size2D &_size, 2084 const f32 * srcBase, ptrdiff_t srcStride, 2085 u8 * dstBase, ptrdiff_t dstStride); 2086 2087 void convert(const Size2D &_size, 2088 const f32 * srcBase, ptrdiff_t srcStride, 2089 s8 * dstBase, ptrdiff_t dstStride); 2090 2091 void convert(const Size2D &_size, 2092 const f32 * srcBase, ptrdiff_t srcStride, 2093 u16 * dstBase, ptrdiff_t dstStride); 2094 2095 void convert(const Size2D &_size, 2096 const f32 * srcBase, ptrdiff_t srcStride, 2097 s16 * dstBase, ptrdiff_t dstStride); 2098 2099 void convert(const Size2D &_size, 2100 const f32 * srcBase, ptrdiff_t srcStride, 2101 s32 * dstBase, ptrdiff_t dstStride); 2102 2103 /* 2104 Convert data from source to destination type with scaling 2105 dst = saturate_cast<dst_type>(src * alpha + beta) 2106 */ 2107 void convertScale(const Size2D &_size, 2108 const u8 * srcBase, ptrdiff_t srcStride, 2109 u8 * dstBase, ptrdiff_t dstStride, 2110 f64 alpha, f64 beta); 2111 2112 void convertScale(const Size2D &_size, 2113 const u8 * srcBase, ptrdiff_t srcStride, 2114 s8 * dstBase, ptrdiff_t dstStride, 2115 f64 alpha, f64 beta); 2116 2117 void convertScale(const Size2D &_size, 2118 const u8 * srcBase, ptrdiff_t srcStride, 2119 u16 * dstBase, ptrdiff_t dstStride, 2120 f64 alpha, f64 beta); 2121 2122 void convertScale(const Size2D &_size, 2123 const u8 * srcBase, ptrdiff_t srcStride, 2124 s16 * dstBase, ptrdiff_t dstStride, 2125 f64 alpha, f64 beta); 2126 2127 void convertScale(const Size2D &_size, 2128 const u8 * srcBase, ptrdiff_t srcStride, 2129 s32 * dstBase, ptrdiff_t dstStride, 2130 f64 alpha, f64 beta); 2131 2132 void convertScale(const Size2D &_size, 2133 const u8 * srcBase, ptrdiff_t srcStride, 2134 f32 * dstBase, ptrdiff_t dstStride, 2135 f64 alpha, f64 beta); 2136 2137 void convertScale(const Size2D &_size, 2138 const s8 * srcBase, ptrdiff_t srcStride, 2139 u8 * dstBase, ptrdiff_t dstStride, 2140 f64 alpha, f64 beta); 2141 2142 void convertScale(const Size2D &_size, 2143 const s8 * srcBase, ptrdiff_t srcStride, 2144 s8 * dstBase, ptrdiff_t dstStride, 2145 f64 alpha, f64 beta); 2146 2147 void convertScale(const Size2D &_size, 2148 const s8 * srcBase, ptrdiff_t srcStride, 2149 u16 * dstBase, ptrdiff_t dstStride, 2150 f64 alpha, f64 beta); 2151 2152 void convertScale(const Size2D &_size, 2153 const s8 * srcBase, ptrdiff_t srcStride, 2154 s16 * dstBase, ptrdiff_t dstStride, 2155 f64 alpha, f64 beta); 2156 2157 void convertScale(const Size2D &_size, 2158 const s8 * srcBase, ptrdiff_t srcStride, 2159 s32 * dstBase, ptrdiff_t dstStride, 2160 f64 alpha, f64 beta); 2161 2162 void convertScale(const Size2D &_size, 2163 const s8 * srcBase, ptrdiff_t srcStride, 2164 f32 * dstBase, ptrdiff_t dstStride, 2165 f64 alpha, f64 beta); 2166 2167 void convertScale(const Size2D &_size, 2168 const u16 * srcBase, ptrdiff_t srcStride, 2169 u8 * dstBase, ptrdiff_t dstStride, 2170 f64 alpha, f64 beta); 2171 2172 void convertScale(const Size2D &_size, 2173 const u16 * srcBase, ptrdiff_t srcStride, 2174 s8 * dstBase, ptrdiff_t dstStride, 2175 f64 alpha, f64 beta); 2176 2177 void convertScale(const Size2D &_size, 2178 const u16 * srcBase, ptrdiff_t srcStride, 2179 u16 * dstBase, ptrdiff_t dstStride, 2180 f64 alpha, f64 beta); 2181 2182 void convertScale(const Size2D &_size, 2183 const u16 * srcBase, ptrdiff_t srcStride, 2184 s16 * dstBase, ptrdiff_t dstStride, 2185 f64 alpha, f64 beta); 2186 2187 void convertScale(const Size2D &_size, 2188 const u16 * srcBase, ptrdiff_t srcStride, 2189 s32 * dstBase, ptrdiff_t dstStride, 2190 f64 alpha, f64 beta); 2191 2192 void convertScale(const Size2D &_size, 2193 const u16 * srcBase, ptrdiff_t srcStride, 2194 f32 * dstBase, ptrdiff_t dstStride, 2195 f64 alpha, f64 beta); 2196 2197 void convertScale(const Size2D &_size, 2198 const s16 * srcBase, ptrdiff_t srcStride, 2199 u8 * dstBase, ptrdiff_t dstStride, 2200 f64 alpha, f64 beta); 2201 2202 void convertScale(const Size2D &_size, 2203 const s16 * srcBase, ptrdiff_t srcStride, 2204 s8 * dstBase, ptrdiff_t dstStride, 2205 f64 alpha, f64 beta); 2206 2207 void convertScale(const Size2D &_size, 2208 const s16 * srcBase, ptrdiff_t srcStride, 2209 u16 * dstBase, ptrdiff_t dstStride, 2210 f64 alpha, f64 beta); 2211 2212 void convertScale(const Size2D &_size, 2213 const s16 * srcBase, ptrdiff_t srcStride, 2214 s16 * dstBase, ptrdiff_t dstStride, 2215 f64 alpha, f64 beta); 2216 2217 void convertScale(const Size2D &_size, 2218 const s16 * srcBase, ptrdiff_t srcStride, 2219 s32 * dstBase, ptrdiff_t dstStride, 2220 f64 alpha, f64 beta); 2221 2222 void convertScale(const Size2D &_size, 2223 const s16 * srcBase, ptrdiff_t srcStride, 2224 f32 * dstBase, ptrdiff_t dstStride, 2225 f64 alpha, f64 beta); 2226 2227 void convertScale(const Size2D &_size, 2228 const s32 * srcBase, ptrdiff_t srcStride, 2229 u8 * dstBase, ptrdiff_t dstStride, 2230 f64 alpha, f64 beta); 2231 2232 void convertScale(const Size2D &_size, 2233 const s32 * srcBase, ptrdiff_t srcStride, 2234 s8 * dstBase, ptrdiff_t dstStride, 2235 f64 alpha, f64 beta); 2236 2237 void convertScale(const Size2D &_size, 2238 const s32 * srcBase, ptrdiff_t srcStride, 2239 u16 * dstBase, ptrdiff_t dstStride, 2240 f64 alpha, f64 beta); 2241 2242 void convertScale(const Size2D &_size, 2243 const s32 * srcBase, ptrdiff_t srcStride, 2244 s16 * dstBase, ptrdiff_t dstStride, 2245 f64 alpha, f64 beta); 2246 2247 void convertScale(const Size2D &_size, 2248 const s32 * srcBase, ptrdiff_t srcStride, 2249 s32 * dstBase, ptrdiff_t dstStride, 2250 f64 alpha, f64 beta); 2251 2252 void convertScale(const Size2D &_size, 2253 const s32 * srcBase, ptrdiff_t srcStride, 2254 f32 * dstBase, ptrdiff_t dstStride, 2255 f64 alpha, f64 beta); 2256 2257 void convertScale(const Size2D &_size, 2258 const f32 * srcBase, ptrdiff_t srcStride, 2259 u8 * dstBase, ptrdiff_t dstStride, 2260 f64 alpha, f64 beta); 2261 2262 void convertScale(const Size2D &_size, 2263 const f32 * srcBase, ptrdiff_t srcStride, 2264 s8 * dstBase, ptrdiff_t dstStride, 2265 f64 alpha, f64 beta); 2266 2267 void convertScale(const Size2D &_size, 2268 const f32 * srcBase, ptrdiff_t srcStride, 2269 u16 * dstBase, ptrdiff_t dstStride, 2270 f64 alpha, f64 beta); 2271 2272 void convertScale(const Size2D &_size, 2273 const f32 * srcBase, ptrdiff_t srcStride, 2274 s16 * dstBase, ptrdiff_t dstStride, 2275 f64 alpha, f64 beta); 2276 2277 void convertScale(const Size2D &_size, 2278 const f32 * srcBase, ptrdiff_t srcStride, 2279 s32 * dstBase, ptrdiff_t dstStride, 2280 f64 alpha, f64 beta); 2281 2282 void convertScale(const Size2D &_size, 2283 const f32 * srcBase, ptrdiff_t srcStride, 2284 f32 * dstBase, ptrdiff_t dstStride, 2285 f64 alpha, f64 beta); 2286 2287 /* 2288 Reduce matrix to a vector by calculatin given operation for each column 2289 */ 2290 void reduceColSum(const Size2D &size, 2291 const u8 * srcBase, ptrdiff_t srcStride, 2292 s32 * dstBase); 2293 2294 void reduceColMax(const Size2D &size, 2295 const u8 * srcBase, ptrdiff_t srcStride, 2296 u8 * dstBase); 2297 2298 void reduceColMin(const Size2D &size, 2299 const u8 * srcBase, ptrdiff_t srcStride, 2300 u8 * dstBase); 2301 2302 void reduceColSum(const Size2D &size, 2303 const f32 * srcBase, ptrdiff_t srcStride, 2304 f32 * dstBase); 2305 2306 void reduceColMax(const Size2D &size, 2307 const f32 * srcBase, ptrdiff_t srcStride, 2308 f32 * dstBase); 2309 2310 void reduceColMin(const Size2D &size, 2311 const f32 * srcBase, ptrdiff_t srcStride, 2312 f32 * dstBase); 2313 2314 /* 2315 For each point `p` within `size`, do: 2316 dst[p] = (rng1[p] <= src[p] && src[p] <= rng2[p]) ? 255 : 0 2317 */ 2318 2319 void inRange(const Size2D &_size, 2320 const u8 * srcBase, ptrdiff_t srcStride, 2321 const u8 * rng1Base, ptrdiff_t rng1Stride, 2322 const u8 * rng2Base, ptrdiff_t rng2Stride, 2323 u8 * dstBase, ptrdiff_t dstStride); 2324 2325 void inRange(const Size2D &_size, 2326 const s8 * srcBase, ptrdiff_t srcStride, 2327 const s8 * rng1Base, ptrdiff_t rng1Stride, 2328 const s8 * rng2Base, ptrdiff_t rng2Stride, 2329 u8 * dstBase, ptrdiff_t dstStride); 2330 2331 void inRange(const Size2D &_size, 2332 const u16 * srcBase, ptrdiff_t srcStride, 2333 const u16 * rng1Base, ptrdiff_t rng1Stride, 2334 const u16 * rng2Base, ptrdiff_t rng2Stride, 2335 u8 * dstBase, ptrdiff_t dstStride); 2336 2337 void inRange(const Size2D &_size, 2338 const s16 * srcBase, ptrdiff_t srcStride, 2339 const s16 * rng1Base, ptrdiff_t rng1Stride, 2340 const s16 * rng2Base, ptrdiff_t rng2Stride, 2341 u8 * dstBase, ptrdiff_t dstStride); 2342 2343 void inRange(const Size2D &_size, 2344 const s32 * srcBase, ptrdiff_t srcStride, 2345 const s32 * rng1Base, ptrdiff_t rng1Stride, 2346 const s32 * rng2Base, ptrdiff_t rng2Stride, 2347 u8 * dstBase, ptrdiff_t dstStride); 2348 2349 void inRange(const Size2D &_size, 2350 const f32 * srcBase, ptrdiff_t srcStride, 2351 const f32 * rng1Base, ptrdiff_t rng1Stride, 2352 const f32 * rng2Base, ptrdiff_t rng2Stride, 2353 u8 * dstBase, ptrdiff_t dstStride); 2354 2355 /* 2356 Estimate amount of non zero elements 2357 */ 2358 s32 countNonZero(const Size2D &_size, 2359 const u8 * srcBase, ptrdiff_t srcStride); 2360 2361 s32 countNonZero(const Size2D &_size, 2362 const u16 * srcBase, ptrdiff_t srcStride); 2363 2364 s32 countNonZero(const Size2D &_size, 2365 const s32 * srcBase, ptrdiff_t srcStride); 2366 2367 s32 countNonZero(const Size2D &_size, 2368 const f32 * srcBase, ptrdiff_t srcStride); 2369 2370 s32 countNonZero(const Size2D &_size, 2371 const f64 * srcBase, ptrdiff_t srcStride); 2372 2373 /* 2374 Calculates sum of all image pixel values and squared values 2375 */ 2376 bool isSumSupported(u32 channels); 2377 2378 void sum(const Size2D &_size, 2379 const u8 * srcBase, ptrdiff_t srcStride, 2380 u32 * sumdst, u32 channels); 2381 2382 void sum(const Size2D &_size, 2383 const f32 * srcBase, ptrdiff_t srcStride, 2384 f64 * sumdst, u32 channels); 2385 2386 bool isSqsumSupported(u32 channels); 2387 2388 void sqsum(const Size2D &_size, 2389 const u8 * srcBase, ptrdiff_t srcStride, 2390 f64 * sumdst, f64 * sqsumdst, u32 channels); 2391 2392 /* 2393 Calculates norm 2394 */ 2395 s32 normInf(const Size2D &_size, 2396 const u8 * srcBase, ptrdiff_t srcStride); 2397 2398 s32 normInf(const Size2D &_size, 2399 const s8 * srcBase, ptrdiff_t srcStride); 2400 2401 s32 normInf(const Size2D &_size, 2402 const u16 * srcBase, ptrdiff_t srcStride); 2403 2404 s32 normInf(const Size2D &_size, 2405 const s16 * srcBase, ptrdiff_t srcStride); 2406 2407 s32 normInf(const Size2D &_size, 2408 const s32 * srcBase, ptrdiff_t srcStride); 2409 2410 f32 normInf(const Size2D &_size, 2411 const f32 * srcBase, ptrdiff_t srcStride); 2412 2413 s32 normL1(const Size2D &_size, 2414 const u8 * srcBase, ptrdiff_t srcStride); 2415 2416 s32 normL1(const Size2D &_size, 2417 const s8 * srcBase, ptrdiff_t srcStride); 2418 2419 s32 normL1(const Size2D &_size, 2420 const u16 * srcBase, ptrdiff_t srcStride); 2421 2422 s32 normL1(const Size2D &_size, 2423 const s16 * srcBase, ptrdiff_t srcStride); 2424 2425 f64 normL1(const Size2D &_size, 2426 const s32 * srcBase, ptrdiff_t srcStride); 2427 2428 f64 normL1(const Size2D &_size, 2429 const f32 * srcBase, ptrdiff_t srcStride); 2430 2431 s32 normL2(const Size2D &_size, 2432 const u8 * srcBase, ptrdiff_t srcStride); 2433 2434 s32 normL2(const Size2D &_size, 2435 const s8 * srcBase, ptrdiff_t srcStride); 2436 2437 f64 normL2(const Size2D &_size, 2438 const u16 * srcBase, ptrdiff_t srcStride); 2439 2440 f64 normL2(const Size2D &_size, 2441 const s16 * srcBase, ptrdiff_t srcStride); 2442 2443 f64 normL2(const Size2D &_size, 2444 const s32 * srcBase, ptrdiff_t srcStride); 2445 2446 f64 normL2(const Size2D &_size, 2447 const f32 * srcBase, ptrdiff_t srcStride); 2448 2449 /* 2450 Calculates norm of per element difference 2451 */ 2452 s32 diffNormInf(const Size2D &_size, 2453 const u8 * src0Base, ptrdiff_t src0Stride, 2454 const u8 * src1Base, ptrdiff_t src1Stride); 2455 2456 f32 diffNormInf(const Size2D &_size, 2457 const f32 * src0Base, ptrdiff_t src0Stride, 2458 const f32 * src1Base, ptrdiff_t src1Stride); 2459 2460 s32 diffNormL1(const Size2D &_size, 2461 const u8 * src0Base, ptrdiff_t src0Stride, 2462 const u8 * src1Base, ptrdiff_t src1Stride); 2463 2464 f64 diffNormL1(const Size2D &_size, 2465 const f32 * src0Base, ptrdiff_t src0Stride, 2466 const f32 * src1Base, ptrdiff_t src1Stride); 2467 2468 s32 diffNormL2(const Size2D &_size, 2469 const u8 * src0Base, ptrdiff_t src0Stride, 2470 const u8 * src1Base, ptrdiff_t src1Stride); 2471 2472 f64 diffNormL2(const Size2D &_size, 2473 const f32 * src0Base, ptrdiff_t src0Stride, 2474 const f32 * src1Base, ptrdiff_t src1Stride); 2475 2476 /* 2477 * Pyramidal Lucas-Kanade Optical Flow level processing 2478 */ 2479 void pyrLKOptFlowLevel(const Size2D &size, s32 cn, 2480 const u8 *prevData, ptrdiff_t prevStride, 2481 const s16 *prevDerivData, ptrdiff_t prevDerivStride, 2482 const u8 *nextData, ptrdiff_t nextStride, 2483 u32 ptCount, 2484 const f32 *prevPts, f32 *nextPts, 2485 u8 *status, f32 *err, 2486 const Size2D &winSize, 2487 u32 terminationCount, f64 terminationEpsilon, 2488 u32 level, u32 maxLevel, bool useInitialFlow, bool getMinEigenVals, 2489 f32 minEigThreshold); 2490 } 2491 2492 #endif 2493