summaryrefslogtreecommitdiffhomepage
path: root/FTNoIR_Tracker_PT/camera.h
blob: 6768e41996d1585792a52dddfaa0a2baa4fce64e (plain)
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/* Copyright (c) 2012 Patrick Ruoff
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 */

#ifndef CAMERA_H
#define CAMERA_H

#include <opencv2/opencv.hpp>
#ifndef OPENTRACK_API
#   include <boost/shared_ptr.hpp>
#else
#   include "FTNoIR_Tracker_PT/boost-compat.h"
#   include <opencv2/highgui/highgui.hpp>
#   include <opencv2/highgui/highgui_c.h>
#endif
#include <string>

// ----------------------------------------------------------------------------
void get_camera_device_names(std::vector<std::string>& device_names);


// ----------------------------------------------------------------------------
struct CamInfo
{
    CamInfo() : res_x(0), res_y(0), fps(0), fov(56) {}

	int res_x;
	int res_y;
	int fps;
    float fov;
};

// ----------------------------------------------------------------------------
// Base class for cameras, calculates the frame rate
class Camera
{
public:
        Camera() : dt_valid(0), dt_mean(0), desired_index(0), active_index(-1), active(false) {}
        virtual ~Camera() {}

        // start/stop capturing
        virtual void start() = 0;
        virtual void stop() = 0;
        void restart() { stop(); start(); }

        // calls corresponding template methods and reinitializes frame rate calculation
        void set_device_index(int index);
        void set_fov(float f);
        void set_fps(int fps);
        void set_res(int x_res, int y_res);

        // gets a frame from the camera, dt: time since last call in seconds
        bool get_frame(float dt, cv::Mat* frame);

        // WARNING: returned references are valid as long as object
        const CamInfo& get_info() const    { return cam_info; }
        const CamInfo& get_desired() const { return cam_desired; }

protected:
        // get a frame from the camera
        virtual bool _get_frame(cv::Mat* frame) = 0;

        // update the camera using cam_desired, write res and f to cam_info if successful
        virtual void _set_device_index() = 0;
        virtual void _set_f() = 0;
        virtual void _set_fps() = 0;
        virtual void _set_res() = 0;

        float dt_valid;
        float dt_mean;
        int desired_index;
        int active_index;
        bool active;
        CamInfo cam_info;
        CamInfo cam_desired;
};


// ----------------------------------------------------------------------------
// camera based on OpenCV's videoCapture
#ifdef OPENTRACK_API
class CVCamera : public Camera
{
public:
	CVCamera() : cap(NULL) {}
	~CVCamera() { stop(); }

	virtual void start();
	virtual void stop();

protected:
	virtual bool _get_frame(cv::Mat* frame);
	virtual void _set_index();
	virtual void _set_f();
	virtual void _set_fps();
	virtual void _set_res();
    virtual void _set_device_index();

    cv::VideoCapture* cap;
};
#else
// ----------------------------------------------------------------------------
// Camera based on the videoInput library
class VICamera : public Camera
{
public:
	VICamera();
	~VICamera() { stop(); }

	virtual void start();
	virtual void stop();

protected:
	virtual bool _get_frame(cv::Mat* frame);
	virtual void _set_device_index();
	virtual void _set_f();
	virtual void _set_fps();
	virtual void _set_res();

	videoInput VI;
	cv::Mat new_frame;
	unsigned char* frame_buffer;
};
#endif

enum RotationType
{
    CLOCKWISE = 0,
    ZERO = 1,
    COUNTER_CLOCKWISE = 2
};

// ----------------------------------------------------------------------------
class FrameRotation 
{
public:
    RotationType rotation;

	cv::Mat rotate_frame(cv::Mat frame);
};

#endif //CAMERA_H