summaryrefslogtreecommitdiffhomepage
path: root/video-opencv
diff options
context:
space:
mode:
Diffstat (limited to 'video-opencv')
-rw-r--r--video-opencv/impl-camera.cpp33
-rw-r--r--video-opencv/impl.hpp5
-rw-r--r--video-opencv/settings.hpp13
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};
+};