diff options
Diffstat (limited to 'video-opencv')
-rw-r--r-- | video-opencv/camera-impl.cpp | 133 | ||||
-rw-r--r-- | video-opencv/impl-camera.cpp | 96 | ||||
-rw-r--r-- | video-opencv/impl-metadata.cpp | 42 |
3 files changed, 138 insertions, 133 deletions
diff --git a/video-opencv/camera-impl.cpp b/video-opencv/camera-impl.cpp index c7869ad5..e69de29b 100644 --- a/video-opencv/camera-impl.cpp +++ b/video-opencv/camera-impl.cpp @@ -1,133 +0,0 @@ -#include "camera-impl.hpp" -#include "compat/sleep.hpp" - -#include "camera-names.hpp" -#include "video-property-page.hpp" - -namespace opencv_camera_impl { - -metadata::metadata() = default; - -std::unique_ptr<camera> metadata::make_camera(const QString& name) -{ - int idx = camera_name_to_index(name); - if (idx != -1) - return std::make_unique<cam>(idx); - else - return nullptr; -} - -std::vector<QString> metadata::camera_names() const -{ - return get_camera_names(); -} - -bool metadata::can_show_dialog(const QString& camera_name) -{ - return camera_name_to_index(camera_name) != -1; -} - -bool metadata::show_dialog(const QString& camera_name) -{ - int idx = camera_name_to_index(camera_name); - if (idx != -1) - { - video_property_page::show(idx); - return true; - } - else - return false; -} - -cam::cam(int idx) : idx(idx) -{ -} - -cam::~cam() -{ - stop(); -} - -void cam::stop() -{ - if (cap) - { - if (cap->isOpened()) - cap->release(); - cap = std::nullopt; - } - mat = cv::Mat(); - frame_ = { {}, false }; -} - -bool cam::is_open() -{ - return !!cap; -} - -bool cam::start(const info& args) -{ - stop(); - cap.emplace(idx); - - if (args.width > 0 && args.height > 0) - { - cap->set(cv::CAP_PROP_FRAME_WIDTH, args.width); - cap->set(cv::CAP_PROP_FRAME_HEIGHT, args.height); - } - if (args.fps > 0) - cap->set(cv::CAP_PROP_FPS, args.fps); - - if (!cap->isOpened()) - goto fail; - - if (!get_frame_()) - goto fail; - - return true; - -fail: - stop(); - return false; -} - -bool cam::get_frame_() -{ - if (!is_open()) - return false; - - for (unsigned i = 0; i < 10; i++) - { - if (cap->read(mat)) - { - frame_.data = mat.data; - frame_.width = mat.cols; - frame_.height = mat.rows; - frame_.stride = mat.step.p[0]; - frame_.channels = mat.channels(); - - return true; - } - portable::sleep(50); - } - - return false; -} - -std::tuple<const frame&, bool> cam::get_frame() -{ - bool ret = get_frame_(); - return { frame_, ret }; -} - -bool cam::show_dialog() -{ - if (is_open()) - return video_property_page::show_from_capture(*cap, idx); - else - return video_property_page::show(idx); -} - -OTR_REGISTER_CAMERA(metadata) - -} // ns opencv_camera_impl diff --git a/video-opencv/impl-camera.cpp b/video-opencv/impl-camera.cpp new file mode 100644 index 00000000..0c42e30a --- /dev/null +++ b/video-opencv/impl-camera.cpp @@ -0,0 +1,96 @@ +#include "impl.hpp" +#include "compat/sleep.hpp" +#include "video-property-page.hpp" + +namespace opencv_camera_impl { + +cam::cam(int idx) : idx(idx) +{ +} + +cam::~cam() +{ + stop(); +} + +void cam::stop() +{ + if (cap) + { + if (cap->isOpened()) + cap->release(); + cap = std::nullopt; + } + mat = cv::Mat(); + frame_ = { {}, false }; +} + +bool cam::is_open() +{ + return !!cap; +} + +bool cam::start(const info& args) +{ + stop(); + cap.emplace(idx); + + if (args.width > 0 && args.height > 0) + { + cap->set(cv::CAP_PROP_FRAME_WIDTH, args.width); + cap->set(cv::CAP_PROP_FRAME_HEIGHT, args.height); + } + if (args.fps > 0) + cap->set(cv::CAP_PROP_FPS, args.fps); + + if (!cap->isOpened()) + goto fail; + + if (!get_frame_()) + goto fail; + + return true; + +fail: + stop(); + return false; +} + +bool cam::get_frame_() +{ + if (!is_open()) + return false; + + for (unsigned i = 0; i < 10; i++) + { + if (cap->read(mat)) + { + frame_.data = mat.data; + frame_.width = mat.cols; + frame_.height = mat.rows; + frame_.stride = mat.step.p[0]; + frame_.channels = mat.channels(); + + return true; + } + portable::sleep(50); + } + + return false; +} + +std::tuple<const frame&, bool> cam::get_frame() +{ + bool ret = get_frame_(); + return { frame_, ret }; +} + +bool cam::show_dialog() +{ + if (is_open()) + return video_property_page::show_from_capture(*cap, idx); + else + return video_property_page::show(idx); +} + +} // ns opencv_camera_impl diff --git a/video-opencv/impl-metadata.cpp b/video-opencv/impl-metadata.cpp new file mode 100644 index 00000000..84b11822 --- /dev/null +++ b/video-opencv/impl-metadata.cpp @@ -0,0 +1,42 @@ +#include "impl.hpp" +#include "camera-names.hpp" +#include "video-property-page.hpp" + +namespace opencv_camera_impl { + +metadata::metadata() = default; + +std::unique_ptr<camera> metadata::make_camera(const QString& name) +{ + int idx = camera_name_to_index(name); + if (idx != -1) + return std::make_unique<cam>(idx); + else + return nullptr; +} + +std::vector<QString> metadata::camera_names() const +{ + return get_camera_names(); +} + +bool metadata::can_show_dialog(const QString& camera_name) +{ + return camera_name_to_index(camera_name) != -1; +} + +bool metadata::show_dialog(const QString& camera_name) +{ + int idx = camera_name_to_index(camera_name); + if (idx != -1) + { + video_property_page::show(idx); + return true; + } + else + return false; +} + +OTR_REGISTER_CAMERA(metadata) + +} // ns opencv_camera_impl |