summaryrefslogtreecommitdiffhomepage
path: root/tracker-pt/camera.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tracker-pt/camera.cpp')
-rw-r--r--tracker-pt/camera.cpp128
1 files changed, 47 insertions, 81 deletions
diff --git a/tracker-pt/camera.cpp b/tracker-pt/camera.cpp
index 82f4a6fe..60eb4bb8 100644
--- a/tracker-pt/camera.cpp
+++ b/tracker-pt/camera.cpp
@@ -6,60 +6,23 @@
*/
#include "camera.h"
-#include "compat/camera-names.hpp"
#include <string>
#include <QDebug>
-Camera::~Camera() {}
-
-void Camera::set_device(const QString& name)
-{
- const int index = camera_name_to_index(name);
-
- desired_name = name;
-
- if (desired_index != index)
- {
- desired_index = index;
- _set_device_index();
-
- // reset fps
- dt_valid = 0;
- dt_mean = 0;
- active_index = index;
- }
-}
-
QString Camera::get_desired_name() const
{
return desired_name;
}
-void Camera::set_fps(int fps)
-{
- if (cam_desired.fps != fps)
- {
- cam_desired.fps = fps;
- _set_fps();
- }
-}
-
-void Camera::set_res(int x_res, int y_res)
+QString Camera::get_active_name() const
{
- if (cam_desired.res_x != x_res || cam_desired.res_y != y_res)
- {
- cam_desired.res_x = x_res;
- cam_desired.res_y = y_res;
- _set_res();
- }
+ return active_name;
}
DEFUN_WARN_UNUSED bool Camera::get_info(CamInfo& ret)
{
if (cam_info.res_x == 0 || cam_info.res_y == 0)
- {
return false;
- }
ret = cam_info;
return true;
}
@@ -68,7 +31,7 @@ bool Camera::get_frame(double dt, cv::Mat* frame)
{
bool new_frame = _get_frame(frame);
// measure fps of valid frames
- static constexpr double RC = 1; // second
+ static constexpr double RC = .1; // seconds
const double alpha = dt/(dt + RC);
dt_valid += dt;
if (new_frame)
@@ -76,8 +39,8 @@ bool Camera::get_frame(double dt, cv::Mat* frame)
if (dt_mean < 2e-3)
dt_mean = dt;
else
- dt_mean = alpha * dt_mean + (1 - alpha) * dt_valid;
- cam_info.fps = int(std::round(dt_mean > 2e-3 ? 1 / dt_mean : 0));
+ dt_mean = (1-alpha) * dt_mean + alpha * dt_valid;
+ cam_info.fps = dt_mean > 2e-3 ? int(1 / dt_mean + .65) : 0;
dt_valid = 0;
}
else
@@ -85,40 +48,52 @@ bool Camera::get_frame(double dt, cv::Mat* frame)
return new_frame;
}
-void CVCamera::start()
+DEFUN_WARN_UNUSED bool Camera::start(int idx, int fps, int res_x, int res_y)
{
- stop();
- cap = new cv::VideoCapture(desired_index);
- _set_res();
- _set_fps();
- // extract camera info
- if (cap->isOpened())
+ if (idx >= 0 && fps >= 0 && res_x > 0 && res_y > 0)
{
- active_index = desired_index;
- cam_info.res_x = 0;
- cam_info.res_y = 0;
- } else {
- stop();
+ if (!cap || cap->isOpened() ||
+ cam_desired.idx != idx ||
+ cam_desired.fps != fps ||
+ cam_desired.res_x != res_x ||
+ cam_desired.res_y != res_y)
+ {
+ cam_desired.idx = idx;
+ cam_desired.fps = fps;
+ cam_desired.res_x = res_x;
+ cam_desired.res_y = res_y;
+
+ cap = camera_ptr(new cv::VideoCapture(cam_desired.idx));
+
+ cap->set(cv::CAP_PROP_FRAME_WIDTH, cam_desired.res_x);
+ cap->set(cv::CAP_PROP_FRAME_HEIGHT, cam_desired.res_y);
+ cap->set(cv::CAP_PROP_FPS, cam_desired.fps);
+
+ if (cap->isOpened())
+ {
+ cam_info.idx = cam_desired.idx;
+ cam_info.res_x = 0;
+ cam_info.res_y = 0;
+ active_name = desired_name;
+
+ return true;
+ }
+ }
}
+
+ return stop(), false;
}
-void CVCamera::stop()
+void Camera::stop()
{
- if (cap)
- {
- const bool opened = cap->isOpened();
- if (opened)
- {
- qDebug() << "pt: freeing camera";
- cap->release();
- }
- delete cap;
- cap = nullptr;
- qDebug() << "pt camera: stopped";
- }
+ cap = nullptr;
+ desired_name = QString();
+ active_name = QString();
+ cam_info = CamInfo();
+ cam_desired = CamInfo();
}
-bool CVCamera::_get_frame(cv::Mat* frame)
+bool Camera::_get_frame(cv::Mat* frame)
{
if (cap && cap->isOpened())
{
@@ -135,21 +110,12 @@ bool CVCamera::_get_frame(cv::Mat* frame)
return false;
}
-void CVCamera::_set_fps()
-{
- if (cap) cap->set(cv::CAP_PROP_FPS, cam_desired.fps);
-}
-
-void CVCamera::_set_res()
+void Camera::camera_deleter::operator()(cv::VideoCapture* cap)
{
if (cap)
{
- cap->set(cv::CAP_PROP_FRAME_WIDTH, cam_desired.res_x);
- cap->set(cv::CAP_PROP_FRAME_HEIGHT, cam_desired.res_y);
+ if (cap->isOpened())
+ cap->release();
+ std::default_delete<cv::VideoCapture>()(cap);
}
}
-void CVCamera::_set_device_index()
-{
- if (desired_index != active_index)
- stop();
-}