Files
Loongson_2k0300_SmartCar_Fr…/vision/camera.cpp

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();
}