1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm
#pragma once
#include "core/panoDimensions.hpp"
#include "gpu/buffer.hpp"
#include "gpu/stream.hpp"
#include <stdint.h>
namespace VideoStitch {
namespace Core {
/**
* Compute the generalized voronoi diagram of @a src with euclidean distance
* @param dst Output buffer for the voronoi diagram. Only two values: 0 and 255.
* @param src Source buffer containing a setup image (i.e. the i-th bit of a pixel represents the i-th input).
* @param work A work buffer.
* @param width Width of the previous buffers.
* @param height Height of the previous buffers.
* @param fromIdMask Bit mask of the first input (e.g. if 0x00000004, the first input will be input 2, starting at 0).
* @param toIdMask Bit mask of the second input.
* @param hWrap If true, we consider the buffer to wrap horizontally.
* @param blockSize GPU block size
* @param stream GPU stream where to run the kernels.
*/
Status voronoiCompute(GPU::Buffer<unsigned char> dst, GPU::Buffer<uint32_t> src, GPU::Buffer<uint32_t> work,
std::size_t width, std::size_t height, uint32_t fromIdMask, uint32_t toIdMask, bool hWrap,
unsigned blockSize, GPU::Stream stream);
/**
* Compute a blending mask between two image regions
*
* Variation of a of 2-site generalized voronoi diagram computation using Jump Flooding,
* modified to enable creating smooth transition maps.
*
* We first compute two distance maps to each of the images, then merge them.
*
* @param dst Output buffer for the mask. Output values are in [0;255].
* @param src Source buffer containing a setup image (i.e. the i-th bit of a pixel represents the i-th input).
* @param work1 First work buffer. Same size as @a src.
* @param work2 Second work buffer. Same size as @a src.
* @param proj Output projection of the pano. Uses angular distance for equirect, euclidean distance otherwise.
* @param region Output rect that describes the region of the source image in the pano
* @param fromIdMask Bit mask of the first input (e.g. if 0x00000004, the first input will be input 2, starting at 0).
* @param toIdMask Bit mask of the second input.
* @param hWrap If true, we consider the buffer to wrap horizontally.
* @param maxTransitionDistance maximum width of the transition / overlap. In rad for equirect pano, otherwise in output
* pixels.
* @param power parameter of the p-norm that's used to calculate the transition. Should be >= 2.0 to use at least L2.
* Steeper transition with larger power.
* @param stream GPU stream where to run the kernels.
*/
Status computeMask(GPU::Buffer<unsigned char> dst, GPU::Buffer<uint32_t> src, GPU::Buffer<uint32_t> work1,
GPU::Buffer<uint32_t> work2, const PanoRegion& region, uint32_t fromIdMask, uint32_t toIdMask,
bool hWrap, float maxTransitionDistance, float power, GPU::Stream stream);
/**
* Set the blending mask for the first image
* @param dst Output buffer for the mask. Output values are in [0;255].
* @param src Source buffer containing a setup image (i.e. the i-th bit of a pixel represents the i-th input).
* @param fromIdMask Bit mask of the first input (e.g. if 0x00000004, the first input will be input 2, starting at 0).
* @param stream GPU stream where to run the kernels.
*/
Status setInitialImageMask(GPU::Buffer<unsigned char> dst, GPU::Buffer<uint32_t> src, std::size_t width,
std::size_t height, uint32_t fromIdMask, GPU::Stream stream);
/**
* Compute the euclidean distance map around a source
* For the parameters, see the computeMask function
*/
Status computeEuclideanDistanceMap(GPU::Buffer<unsigned char> dst, GPU::Buffer<const uint32_t> src,
GPU::Buffer<uint32_t> work1, GPU::Buffer<uint32_t> work2, std::size_t width,
std::size_t height, uint32_t idMask, bool hWrap, float maxTransitionDistance,
float power, GPU::Stream stream);
/**
* Compute the euclidean distance map between two sources
* For the parameters, see the computeMask function
*/
Status computeEuclideanDistanceMap(GPU::Buffer<unsigned char> dst, GPU::Buffer<const uint32_t> src,
GPU::Buffer<uint32_t> work1, GPU::Buffer<uint32_t> work2, std::size_t width,
std::size_t height, uint32_t fromIdMask, uint32_t toIdMask, bool hWrap,
float maxTransitionDistance, float power, GPU::Stream stream);
} // namespace Core
} // namespace VideoStitch