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
// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm
#include "calibrationAlgorithmBase.hpp"
#include "calibrationProgress.hpp"
#include "gpu/memcpy.hpp"
#include "gpu/uniqueBuffer.hpp"
#include "image/unpack.hpp"
namespace VideoStitch {
namespace Calibration {
CalibrationAlgorithmBase::CalibrationAlgorithmBase(const Ptv::Value* config) : calibConfig(config) {}
CalibrationAlgorithmBase::~CalibrationAlgorithmBase() {}
Status CalibrationAlgorithmBase::loadInputImage(std::shared_ptr<CvImage>& result, const GPU::Surface& input, int width,
int height) const {
// Allocate colorspace conversion result on the Device
auto potFrameBuffer = GPU::Buffer2D::allocate(width, height, "Frame Loading");
FAIL_RETURN(potFrameBuffer.status());
auto frameBuffer = potFrameBuffer.value();
// Allocate colorspace conversion result on the host
auto hostFrame = GPU::HostBuffer<unsigned char>::allocate(width * height, "Frame Loading");
FAIL_RETURN(hostFrame.status());
// Perform colorspace conversion from RGBA to grayscale
Status gpuStatus = [&result, &frameBuffer, &hostFrame, &input, width, height]() -> Status {
auto stream = GPU::Stream::getDefault();
FAIL_RETURN(Image::unpackGrayscale(frameBuffer, input, width, height, stream));
FAIL_RETURN(GPU::memcpyBlocking(hostFrame.value(), frameBuffer));
// Create OpenCV Wrapper for image, takes ownership of hostFrame
result = std::shared_ptr<CvImage>(new Calibration::CvImage(hostFrame.value(), width, height));
return Status::OK();
}();
if (!gpuStatus.ok()) {
hostFrame.value().release();
}
frameBuffer.release();
return gpuStatus;
}
double CalibrationAlgorithmBase::getProgressUnits(const int numVideoInputs, const int numFramesTuples) const {
const double numFrames = static_cast<double>(numFramesTuples);
const double numCameras = static_cast<double>(numVideoInputs);
double totalProgressUnits = 0.;
if (!calibConfig.isApplyingPresetsOnly()) {
// Seek, detection and matching
totalProgressUnits += (numFrames * numCameras * (CalibrationProgress::seek + CalibrationProgress::kpDetect));
totalProgressUnits += (numFrames * (numCameras - 1) * (0.5 * numCameras) * CalibrationProgress::kpMatch);
}
if (calibConfig.isFovDefined()) {
// FOV iterations
totalProgressUnits += CalibrationProgress::fovIterate;
}
if (calibConfig.isInDeshuffleMode()) {
// Deshuffling progress
totalProgressUnits += CalibrationProgress::deshuffle;
}
if (!calibConfig.isApplyingPresetsOnly() && !calibConfig.isInDeshuffleModeOnly()) {
// Optimization progress
totalProgressUnits += CalibrationProgress::filter + CalibrationProgress::initGeometry + CalibrationProgress::optim +
CalibrationProgress::optim_done;
}
return totalProgressUnits;
}
} // namespace Calibration
} // namespace VideoStitch