diff options
Diffstat (limited to 'tracker-pt/camera.cpp')
-rw-r--r-- | tracker-pt/camera.cpp | 128 |
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(); -} |