57 lines
1.3 KiB
C++
57 lines
1.3 KiB
C++
#include "camera.hpp"
|
|
#include <atomic>
|
|
#include <mutex>
|
|
#include <thread>
|
|
|
|
static cv::VideoCapture* cap = nullptr;
|
|
static cv::Mat pubframe;
|
|
static std::mutex frame_mutex;
|
|
static std::atomic<bool> stream_running{false};
|
|
|
|
bool camera_init()
|
|
{
|
|
cap = new cv::VideoCapture(0);
|
|
if (!cap->isOpened()) return false;
|
|
|
|
cap->set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
|
|
cap->set(cv::CAP_PROP_FRAME_WIDTH, CAMERA_WIDTH);
|
|
cap->set(cv::CAP_PROP_FRAME_HEIGHT, CAMERA_HEIGHT);
|
|
cap->set(cv::CAP_PROP_AUTO_EXPOSURE, -1);
|
|
|
|
return true;
|
|
}
|
|
|
|
void camera_deinit()
|
|
{
|
|
if (cap) { cap->release(); delete cap; cap = nullptr; }
|
|
}
|
|
|
|
cv::Mat camera_capture()
|
|
{
|
|
std::lock_guard<std::mutex> lock(frame_mutex);
|
|
return pubframe.clone();
|
|
}
|
|
|
|
cv::Mat camera_resize(const cv::Mat& src)
|
|
{
|
|
cv::Mat resized;
|
|
cv::resize(src, resized, cv::Size(IMAGE_WIDTH, IMAGE_HEIGHT));
|
|
return resized;
|
|
}
|
|
|
|
void camera_stream_start()
|
|
{
|
|
stream_running.store(true);
|
|
std::thread([]() {
|
|
cv::Mat tmp;
|
|
while (stream_running.load())
|
|
{
|
|
if (cap && cap->read(tmp))
|
|
{
|
|
std::lock_guard<std::mutex> lock(frame_mutex);
|
|
pubframe = tmp.clone();
|
|
}
|
|
}
|
|
}).detach();
|
|
}
|