libmx2 2.2.1
C++20 multimedia and game-engine library (SDL2 / OpenGL / Vulkan)
Loading...
Searching...
No Matches
vk_cv.cpp
Go to the documentation of this file.
1/**
2 * @file vk_cv.cpp
3 * @brief Implementation of mx::MXCapture (Vulkan + OpenCV variant).
4 */
5#include"vk_cv.hpp"
6#include<filesystem>
7
8namespace mx {
9
10 bool MXCapture::open(const std::string &filename) {
11 return cap.open(filename);
12 }
13
14 bool MXCapture::open(int id, int mode) {
15 if(mode == 0)
16 mode = cv::CAP_V4L2;
17 if(cap.open(id, mode)) {
18 cap.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M','J','P','G'));
19 return true;
20 }
21 return false;
22 }
23
24 void MXCapture::close() {
25 cap.release();
26 }
27
28 bool MXCapture::createImage(VKWindow *window, size_t width, size_t height, const std::string &vert, const std::string &frag) {
29 sprite = window->createSprite(width, height, vert, frag);
30 if(sprite) {
31 sprite->enableExtendedUBO();
32 sprite->rebuildPipeline();
33 std::cout << ">> MXCapture - CreateSprite for - [OK]\n";
34 return true;
35 }
36 std::cout << ">> MXCapture = CreateSprite for MXCapture failed.\n";
37 return false;
38 }
39
40 bool MXCapture::reload(size_t width, size_t height, const std::string &vert, const std::string &frag) {
41 if(sprite) {
42 sprite->createEmptySprite(width, height,vert, frag);
43 sprite->enableExtendedUBO();
44 std::cout << ">> MXCapture shader reloaded \n Vertex: [" << std::filesystem::path(vert).filename().string() << "] - Fragment: [" << std::filesystem::path(frag).filename().string() << "] \n";
45 return true;
46 }
47 std::cout << ">> MXCapture failure to reload shader\n";
48 return false;
49 }
50
51 bool MXCapture::read(cv::Mat &frame) {
52 return cap.read(frame);
53 }
54
55 bool MXCapture::read() {
56 if(!cap.read(frame)) {
57 return false;
58 }
59 cv::Mat rgba;
60 cv::cvtColor(frame, rgba, cv::COLOR_BGR2RGBA);
61 sprite->updateTexture(rgba.ptr(), rgba.cols, rgba.rows, rgba.step);
62 return true;
63 }
64
65 void MXCapture::draw(int x, int y, int width, int height) {
66 if(sprite)
67 sprite->drawSpriteRect(x, y, width, height);
68 }
69
70 void MXCapture::draw(int x, int y) {
71 if(sprite)
72 sprite->drawSprite(x, y);
73 }
74
75 void MXCapture::set(unsigned int option, double value) {
76 cap.set(option, value);
77 }
78
79 double MXCapture::get(unsigned int option) {
80 return cap.get(option);
81 }
82
83}
void close()
Close the video source.
Definition gl_cv.cpp:25
double get(unsigned int option)
Query a VideoCapture property.
Definition gl_cv.cpp:85
void set(unsigned int option, double value)
Set a VideoCapture property.
Definition gl_cv.cpp:81
bool reload(const std::string &vert, const std::string &frag)
Replace the shader pair without reopening the source.
Definition gl_cv.cpp:44
bool open(const std::string &filename)
Open a video file for capture.
Definition gl_cv.cpp:11
cv::Mat frame
Most recent decoded frame.
Definition gl_cv.hpp:133
gl::GLWindow * window
Parent GL window.
Definition gl_cv.hpp:131
void draw(int x, int y, int width, int height)
Draw the most recently captured frame.
Definition gl_cv.cpp:67
cv::VideoCapture cap
OpenCV capture device.
Definition gl_cv.hpp:132
gl::GLSprite sprite
Rendering sprite.
Definition gl_cv.hpp:129
bool read()
Grab and decode the next frame from the source.
Definition gl_cv.cpp:56
bool createImage(gl::GLWindow *window, size_t width, size_t height, const std::string &vert, const std::string &frag)
Create the backing sprite/texture for displaying frames.
Definition gl_cv.cpp:29
Primary Vulkan rendering window and device management class.
Definition vk.hpp:126
Definition cfg.cpp:11
OpenCV video-capture integration for the Vulkan backend.