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
// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm
#include "drawingUtils.hpp"
#include "pngutil.hpp"
#include <opencv2/core.hpp>
namespace VideoStitch {
namespace Util {
void Drawing::line(cv::Mat& img, const cv::Point& start, const cv::Point& end, const cv::Scalar& c1,
const cv::Scalar& c2) {
cv::LineIterator iter(img, start, end, cv::LINE_8);
for (int i = 0; i < iter.count; i++, iter++) {
double alpha = double(i) / iter.count;
// note: using img.at<T>(iter.pos()) is faster, but
// then you have to deal with mat type and channel number yourself
img(cv::Rect(iter.pos(), cv::Size(1, 1))) = c1 * (1.0 - alpha) + c2 * alpha;
}
}
void Drawing::polylines(cv::Mat& img, const std::vector<cv::Point>& points, const cv::Scalar& c1,
const cv::Scalar& c2) {
if (!points.size()) {
return;
}
float totalDist = 0.0f;
for (size_t i = 0; i < points.size() - 1; i++) {
totalDist += (float)cv::norm(points[i] - points[(i + 1) % points.size()]);
}
float a = 0.0f;
for (size_t i = 0; i < points.size() - 1; i++) {
cv::Scalar ci_0 = c1 * (1.0 - (a / totalDist)) + c2 * (a / totalDist);
a += (float)cv::norm(points[i] - points[(i + 1) % points.size()]);
cv::Scalar ci_1 = c1 * (1.0 - (a / totalDist)) + c2 * (a / totalDist);
line(img, points[i], points[(i + 1) % points.size()], ci_0, ci_1);
}
}
} // namespace Util
} // namespace VideoStitch