diff options
Diffstat (limited to 'tracker-pt/module/camera.cpp')
| -rw-r--r-- | tracker-pt/module/camera.cpp | 149 |
1 files changed, 68 insertions, 81 deletions
diff --git a/tracker-pt/module/camera.cpp b/tracker-pt/module/camera.cpp index 9c62e8a3..1beba474 100644 --- a/tracker-pt/module/camera.cpp +++ b/tracker-pt/module/camera.cpp @@ -7,16 +7,9 @@ #include "camera.h" #include "frame.hpp" +#include <opencv2/core/mat.hpp> -#include "compat/sleep.hpp" -#include "compat/camera-names.hpp" -#include "compat/math-imports.hpp" - -#include <opencv2/imgproc.hpp> - -#include "cv/video-property-page.hpp" - -using namespace pt_module; +namespace pt_module { Camera::Camera(const QString& module_name) : s { module_name } { @@ -24,22 +17,18 @@ Camera::Camera(const QString& module_name) : s { module_name } QString Camera::get_desired_name() const { - return desired_name; + return cam_desired.name; } QString Camera::get_active_name() const { - return active_name; + return cam_info.name; } void Camera::show_camera_settings() { - const int idx = camera_name_to_index(s.camera_name); - - if (cap && cap->isOpened()) - video_property_page::show_from_capture(*cap, idx); - else - video_property_page::show(idx); + if (cap) + (void)cap->show_dialog(); } Camera::result Camera::get_info() const @@ -54,16 +43,16 @@ Camera::result Camera::get_frame(pt_frame& frame_) { cv::Mat& frame = frame_.as<Frame>()->mat; - const bool new_frame = _get_frame(frame); + const bool new_frame = get_frame_(frame); if (new_frame) { - const double dt = t.elapsed_seconds(); + const f dt = (f)t.elapsed_seconds(); t.start(); // measure fps of valid frames - constexpr double RC = .1; // seconds - const double alpha = dt/(dt + RC); + constexpr f RC = f{1}/10; // seconds + const f alpha = dt/(dt + RC); if (dt_mean < dt_eps) dt_mean = dt; @@ -75,64 +64,69 @@ Camera::result Camera::get_frame(pt_frame& frame_) cam_info.res_y = frame.rows; cam_info.fov = fov; - return result(true, cam_info); + return { true, cam_info }; } else - return result(false, pt_camera_info()); + return { false, {} }; } -bool Camera::start(int idx, int fps, int res_x, int res_y) +bool Camera::start(const pt_settings& s) { - if (idx >= 0 && fps >= 0 && res_x >= 0 && res_y >= 0) + int fps = s.cam_fps, res_x = s.cam_res_x, res_y = s.cam_res_y; + QString name = s.camera_name; + bool use_mjpeg = s.use_mjpeg; + + if (fps >= 0 && res_x >= 0 && res_y >= 0) { - if (cam_desired.idx != idx || - cam_desired.fps != fps || + if (cam_desired.name != name || + (int)cam_desired.fps != fps || cam_desired.res_x != res_x || cam_desired.res_y != res_y || - !cap || !cap->isOpened() || !cap->grab()) + cam_desired.use_mjpeg != use_mjpeg || + !cap || !cap->is_open()) { stop(); - desired_name = get_camera_names().value(idx); - cam_desired.idx = idx; - cam_desired.fps = fps; + cam_desired.name = name; + cam_desired.fps = (f)fps; cam_desired.res_x = res_x; cam_desired.res_y = res_y; cam_desired.fov = fov; + cam_desired.use_mjpeg = use_mjpeg; - cap = camera_ptr(new cv::VideoCapture(cam_desired.idx)); - - if (cam_desired.res_x) - cap->set(cv::CAP_PROP_FRAME_WIDTH, cam_desired.res_x); - if (cam_desired.res_y) - cap->set(cv::CAP_PROP_FRAME_HEIGHT, cam_desired.res_y); - if (cam_desired.fps) - cap->set(cv::CAP_PROP_FPS, cam_desired.fps); - - if (cap->isOpened()) - { - cam_info = pt_camera_info(); - active_name = QString(); - cam_info.idx = idx; - dt_mean = 0; - active_name = desired_name; - - cv::Mat tmp; - - if (_get_frame(tmp)) - { - t.start(); - return true; - } - } - - cap = nullptr; - return false; - } + cap = video::make_camera(name); + + if (!cap) + goto fail; + + camera::info info {}; + info.fps = fps; + info.width = res_x; + info.height = res_y; + info.use_mjpeg = use_mjpeg; + info.num_channels = s.blob_color == pt_color_hardware ? 1 : 3; + + if (!cap->start(info)) + goto fail; - return true; + cam_info = pt_camera_info(); + cam_info.name = name; + cam_info.use_mjpeg = use_mjpeg; + cam_info.fov = (f)s.fov; + dt_mean = 0; + + cv::Mat tmp; + + if (!get_frame_(tmp)) + goto fail; + + t.start(); + } } + return true; + +fail: stop(); return false; } @@ -140,33 +134,26 @@ bool Camera::start(int idx, int fps, int res_x, int res_y) void Camera::stop() { cap = nullptr; - desired_name = QString(); - active_name = QString(); - cam_info = pt_camera_info(); - cam_desired = pt_camera_info(); + cam_info = {}; + cam_desired = {}; } -bool Camera::_get_frame(cv::Mat& frame) +bool Camera::get_frame_(cv::Mat& img) { - if (cap && cap->isOpened()) + if (cap && cap->is_open()) { - for (int i = 0; i < 5; i++) + auto [ frame, ret ] = cap->get_frame(); + if (ret) { - if (cap->read(frame)) - return true; - portable::sleep(1); + int stride = frame.stride; + if (stride == 0) + stride = cv::Mat::AUTO_STEP; + img = cv::Mat(frame.height, frame.width, CV_8UC(frame.channels), (void*)frame.data, (size_t)stride); + return true; } } - return false; -} -void Camera::camera_deleter::operator()(cv::VideoCapture* cap) -{ - if (cap) - { - if (cap->isOpened()) - cap->release(); - delete cap; - } + return false; } +} // ns pt_module |
