File: UprightDiff.h

package info (click to toggle)
uprightdiff 1.4.0-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 144 kB
  • sloc: cpp: 893; makefile: 11
file content (74 lines) | stat: -rw-r--r-- 2,146 bytes parent folder | download | duplicates (3)
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
#include <limits>
#include <iostream>
#include "Logger.h"

class UprightDiff {
public:
	typedef unsigned char uchar;
	typedef cv::Mat_<cv::Vec3b> Mat3b;
	typedef cv::Mat_<int> Mat1i;
	typedef cv::Mat_<uchar> Mat1b;

	struct Options {
		int blockSize = 16;
		int windowSize = 200;
		int brushWidth = 9;
		int outerHighlightWindow = 21;
		int innerHighlightWindow = 5;
		std::string intermediateDir;
		std::ostream * logStream = nullptr;
		int logLevel = Logger::FATAL;
		bool logTimestamp = false;
	};

	struct Output {
		int totalArea = 0;
		int maskArea = 0;
		int movedArea = 0;
		int residualArea = 0;
		Mat3b visual;
	};

	enum {
		NOT_FOUND = std::numeric_limits<int>::max(),
		INVALID = NOT_FOUND - 1
	};

	static void Diff(const cv::Mat & alice, const cv::Mat & bob, const Options & options,
			Output & output);

private:
	UprightDiff(const cv::Mat & alice, const cv::Mat & bob, const Options & options,
			Output & output);

	void execute();
	void calculateMaskArea();
	static Mat3b ConvertInput(const char * label, const cv::Mat & input, const cv::Size & size);
	static Mat1i ScaleUpMotion(Mat1i & blockMotion, int blockSize, const cv::Size & destSize);
	void paintSubBlockLine(const cv::Point & start, const cv::Point & step);
	static uchar BgrToGrey(const cv::Vec3b & bgr);
	static cv::Vec3b BgrToFadedGreyBgr(const cv::Vec3b & bgr);
	static int GetStrongConsensus(const cv::Mat1i & block);
	static int GetWeakConsensus(const cv::Mat1i & block);
	Mat3b visualizeResidual();
	void annotateMotion();
	static cv::Point FindMaskCentre(const Mat1b & mask, int totalArea);
	static void ArrowedLine(Mat3b img, cv::Point pt1, cv::Point pt2, const cv::Scalar& color,
			   int thickness = 1, int line_type = 8, int shift = 0, double tipLength = 0.1);

	cv::Mat convertIntermediate(const cv::Mat & m);
	void intermediateOutput(const char* label, const cv::MatExpr & expr);
	void intermediateOutput(const char* label, const cv::Mat & m);
	
	Logger::LogStream & info() {
		return m_logger.log(Logger::INFO);
	}

	const Options & m_options;
	Output & m_output;
	Mat3b m_alice;
	Mat3b m_bob;
	Mat1i m_motion;
	cv::Size m_size;
	Logger m_logger;
};