diff options
Diffstat (limited to 'video-opencv')
-rw-r--r-- | video-opencv/impl-camera.cpp | 33 | ||||
-rw-r--r-- | video-opencv/impl.hpp | 5 | ||||
-rw-r--r-- | video-opencv/settings.hpp | 13 |
3 files changed, 51 insertions, 0 deletions
diff --git a/video-opencv/impl-camera.cpp b/video-opencv/impl-camera.cpp index 662eceb2..afd76310 100644 --- a/video-opencv/impl-camera.cpp +++ b/video-opencv/impl-camera.cpp @@ -1,6 +1,7 @@ #include "impl.hpp" #include "compat/sleep.hpp" #include "video-property-page.hpp" +#include <QDebug> namespace opencv_camera_impl { @@ -30,6 +31,34 @@ bool cam::is_open() return !!cap; } +void cam::set_exposure(bool write) +{ + auto e = *s.exposure; + if (e != exposure) + switch (e) + { + case exposure_preset::near: cap->set(cv::CAP_PROP_EXPOSURE, -5); qDebug() << "near"; break; + case exposure_preset::far: cap->set(cv::CAP_PROP_EXPOSURE, -4); qDebug() << "far"; break; + default: break; + } + + if (s.exposure != exposure_preset::ignored) + { + constexpr struct { + int prop, value; + } props[] = { + { cv::CAP_PROP_AUTO_EXPOSURE, 0 }, + { cv::CAP_PROP_BRIGHTNESS, 0 }, + { cv::CAP_PROP_SHARPNESS, 3 }, + }; + for (const auto [prop, value] : props) + cap->set(prop, value); + } + + if (write) + exposure = e; +} + bool cam::start(info& args) { stop(); @@ -46,6 +75,8 @@ bool cam::start(info& args) if (args.use_mjpeg) cap->set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G')); + set_exposure(false); + if (!cap->isOpened()) goto fail; @@ -82,6 +113,8 @@ bool cam::get_frame_() portable::sleep(50); } + set_exposure(true); + return false; } diff --git a/video-opencv/impl.hpp b/video-opencv/impl.hpp index ed5499b0..8e61989e 100644 --- a/video-opencv/impl.hpp +++ b/video-opencv/impl.hpp @@ -8,6 +8,7 @@ #pragma once #include "video/camera.hpp" +#include "settings.hpp" #include <optional> #include <opencv2/videoio.hpp> @@ -43,13 +44,17 @@ static constexpr int video_capture_backend = bool is_open() override; std::tuple<const frame&, bool> get_frame() override; bool show_dialog() override; + void set_exposure(bool write); bool get_frame_(); + dshow_camera_settings s; + std::optional<cv::VideoCapture> cap; cv::Mat mat; frame frame_; int idx = -1; + exposure_preset exposure = exposure_preset::ignored; }; } // ns opencv_camera_impl diff --git a/video-opencv/settings.hpp b/video-opencv/settings.hpp new file mode 100644 index 00000000..a4f70c25 --- /dev/null +++ b/video-opencv/settings.hpp @@ -0,0 +1,13 @@ +#pragma once +#include "options/value.hpp" +using namespace options; + +enum class exposure_preset : int { + near, far, ignored, + DEFAULT = near, +}; + +struct dshow_camera_settings final { + bundle b = make_bundle("video-camera"); + value<exposure_preset> exposure{b, "exposure-preset", exposure_preset::near}; +}; |