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
|
/* 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.
*/
#pragma once
#include <opencv2/core/core.hpp>
#ifndef OPENTRACK_API
# include <boost/shared_ptr.hpp>
#else
# include <memory>
# include <opencv2/highgui/highgui.hpp>
# include <opencv2/highgui/highgui_c.h>
#endif
#include <string>
#ifndef OPENTRACK_API
// ----------------------------------------------------------------------------
void get_camera_device_names(std::vector<std::string>& device_names);
#endif
// ----------------------------------------------------------------------------
struct CamInfo
{
CamInfo() : res_x(0), res_y(0), fps(0) {}
int res_x;
int res_y;
int fps;
};
// ----------------------------------------------------------------------------
// 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() = 0;
// 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_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
CamInfo get_info();
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_fps() = 0;
virtual void _set_res() = 0;
private:
float dt_valid;
float dt_mean;
protected:
int desired_index;
int active_index;
bool active;
CamInfo cam_info;
CamInfo cam_desired;
};
inline Camera::~Camera() {}
// ----------------------------------------------------------------------------
// camera based on OpenCV's videoCapture
#ifdef OPENTRACK_API
class CVCamera : public Camera
{
public:
CVCamera() : cap(NULL) {}
~CVCamera() { stop(); }
void start() override;
void stop() override;
operator cv::VideoCapture&() { return *cap; }
protected:
bool _get_frame(cv::Mat* frame) override;
void _set_fps() override;
void _set_res() override;
void _set_device_index() override;
private:
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_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
};
|