Merge branch 'main' of ssh://gitea.develter.com:222/lucas/Webcam
This commit is contained in:
@ -9,6 +9,8 @@
|
|||||||
#include "opencv2\opencv.hpp"
|
#include "opencv2\opencv.hpp"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
|
|
||||||
using namespace GS;
|
using namespace GS;
|
||||||
using namespace GS::Script;
|
using namespace GS::Script;
|
||||||
@ -36,10 +38,12 @@ void ProcessWebcamThread::Execute() {
|
|||||||
bool temp_not_finish = true;
|
bool temp_not_finish = true;
|
||||||
bool temp_pause = true;
|
bool temp_pause = true;
|
||||||
bool temp_record_frame = false;
|
bool temp_record_frame = false;
|
||||||
|
current_frame_clock = 0.0;
|
||||||
//construction LUT pour synchro avec la clock squirrel
|
//construction LUT pour synchro avec la clock squirrel
|
||||||
std::ofstream lutFile(outputVideoName+"_lut.bin", std::ios::binary);
|
std::ofstream lutFile(outputVideoName+"_lut.bin", std::ios::binary);
|
||||||
__LOG_CAM__ << "NEW RECORDING THREAD "<<videoIndex<<" LAUNCHED \n";
|
__LOG_CAM__ << "NEW RECORDING THREAD "<<videoIndex<<" LAUNCHED \n";
|
||||||
|
|
||||||
|
int frame_index = 0;
|
||||||
while (temp_not_finish) {
|
while (temp_not_finish) {
|
||||||
|
|
||||||
mutex_not_finish.Lock();
|
mutex_not_finish.Lock();
|
||||||
@ -68,6 +72,8 @@ void ProcessWebcamThread::Execute() {
|
|||||||
im->release();
|
im->release();
|
||||||
lutFile.close();
|
lutFile.close();
|
||||||
|
|
||||||
|
Platform::Get().Sleep(50); // Laisser le fichier se finaliser
|
||||||
|
|
||||||
delete im;
|
delete im;
|
||||||
}
|
}
|
||||||
//*********************************************************
|
//*********************************************************
|
||||||
@ -278,8 +284,7 @@ void Webcam::ResetVideo() {
|
|||||||
std::stringstream video_name;
|
std::stringstream video_name;
|
||||||
video_name << "./webcam_record_" << index_save_video << ".avi";
|
video_name << "./webcam_record_" << index_save_video << ".avi";
|
||||||
// set the codec fourcc
|
// set the codec fourcc
|
||||||
unsigned int ex = outputVideo->fourcc('X', 'V', 'I', 'D');
|
unsigned int ex = outputVideo->fourcc('M', 'J', 'P', 'G');
|
||||||
outputVideo->set(VIDEOWRITER_PROP_QUALITY, 70);
|
|
||||||
outputVideo->open(video_name.str(), ex, webcam_fps, Size(width, height), true);
|
outputVideo->open(video_name.str(), ex, webcam_fps, Size(width, height), true);
|
||||||
|
|
||||||
if (!outputVideo->isOpened())
|
if (!outputVideo->isOpened())
|
||||||
@ -315,10 +320,14 @@ void Webcam::setPause(bool pause) {
|
|||||||
bool thread_pause = thread_process->pause;
|
bool thread_pause = thread_process->pause;
|
||||||
thread_process->mutex_pause.Unlock();
|
thread_process->mutex_pause.Unlock();
|
||||||
|
|
||||||
|
thread_process->mutex_pause.Lock();
|
||||||
|
thread_process->pause = pause;
|
||||||
|
thread_process->mutex_pause.Unlock();
|
||||||
|
|
||||||
if (!thread_pause && pause) {
|
if (!thread_pause && pause) {
|
||||||
__LOG_CAM__ <<"B\n";
|
__LOG_CAM__ <<"B\n";
|
||||||
Close();
|
Close();
|
||||||
|
Platform::Get().Sleep(50); // Laisser le fichier se finaliser
|
||||||
__LOG_CAM__ << "REPLAY INPUT RELEASE ./webcam_record_" << index_replay_video << ".avi\n ";
|
__LOG_CAM__ << "REPLAY INPUT RELEASE ./webcam_record_" << index_replay_video << ".avi\n ";
|
||||||
ReplayInputVideo->release();
|
ReplayInputVideo->release();
|
||||||
index_replay_video = index_save_video - 1;
|
index_replay_video = index_save_video - 1;
|
||||||
@ -359,11 +368,14 @@ void Webcam::Close() {
|
|||||||
thread_process = nullptr;
|
thread_process = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReplayInputVideo->release();
|
if(ReplayInputVideo)
|
||||||
|
ReplayInputVideo->release();
|
||||||
}
|
}
|
||||||
|
|
||||||
uchar *Webcam::SetFrame(float clock, GS::String record_name , int record_index) {
|
uchar *Webcam::SetFrame(float clock, GS::String record_name , int record_index) {
|
||||||
//create buffer from lut
|
//create buffer from lut
|
||||||
|
bool is_the_last_record = record_index == index_save_video - 1 ;
|
||||||
|
|
||||||
if(video_times.size() == 0){
|
if(video_times.size() == 0){
|
||||||
//charger lut dans video_times
|
//charger lut dans video_times
|
||||||
__LOG_CAM__ << "Chargement LUT: "<<record_name<<"_"<<record_index<<"_lut.bin\n";
|
__LOG_CAM__ << "Chargement LUT: "<<record_name<<"_"<<record_index<<"_lut.bin\n";
|
||||||
@ -374,7 +386,6 @@ uchar *Webcam::SetFrame(float clock, GS::String record_name , int record_index)
|
|||||||
if (!lutFile.is_open())
|
if (!lutFile.is_open())
|
||||||
{
|
{
|
||||||
__LOG_CAM__ << "Cannot open LUT file: " << record_name<<"_lut.bin\n";
|
__LOG_CAM__ << "Cannot open LUT file: " << record_name<<"_lut.bin\n";
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
video_times.clear();
|
video_times.clear();
|
||||||
|
|
||||||
@ -387,30 +398,31 @@ uchar *Webcam::SetFrame(float clock, GS::String record_name , int record_index)
|
|||||||
|
|
||||||
lutFile.seekg(size - static_cast<std::streamoff>(sizeof(float)));
|
lutFile.seekg(size - static_cast<std::streamoff>(sizeof(float)));
|
||||||
lutFile.read(reinterpret_cast<char*>(&end_time), sizeof(float));
|
lutFile.read(reinterpret_cast<char*>(&end_time), sizeof(float));
|
||||||
|
|
||||||
__LOG_CAM__ <<"end: "<<(float)end_time<<" asked clock: "<<clock<<"\n";
|
__LOG_CAM__ <<"end: "<<(float)end_time<<" asked clock: "<<clock<<"\n";
|
||||||
//read la derniere et premiere clock
|
//read la derniere et premiere clock
|
||||||
lutFile.seekg(0);
|
lutFile.seekg(0);
|
||||||
float start_time;
|
float start_time;
|
||||||
lutFile.read(reinterpret_cast<char*>(&start_time), sizeof(float));
|
lutFile.read(reinterpret_cast<char*>(&start_time), sizeof(float));
|
||||||
|
|
||||||
|
|
||||||
if(clock < start_time){
|
if(clock < start_time){
|
||||||
__LOG_CAM__ << "clock < start_time\n";
|
__LOG_CAM__ << "clock < start_time\n";
|
||||||
lutFile.close();
|
lutFile.close();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
else if(clock > end_time){
|
else if(clock > end_time && !is_the_last_record){
|
||||||
__LOG_CAM__ << "clock > end_time\n";
|
__LOG_CAM__ << "clock > end_time\n";
|
||||||
lutFile.close();
|
lutFile.close();
|
||||||
return SetFrame(clock,record_name,record_index+1); //recursive search forward
|
return SetFrame(clock,record_name,record_index+1); //recursive search forward
|
||||||
}
|
}
|
||||||
|
|
||||||
if (record_index != index_replay_video) {
|
if (record_index != index_replay_video) {
|
||||||
__LOG_H__ << "Changing video\n";
|
__LOG_CAM__ << "Changing video\n";
|
||||||
index_replay_video = record_index;
|
index_replay_video = record_index;
|
||||||
std::stringstream video_name;
|
std::stringstream video_name;
|
||||||
video_name << record_name << "_" << index_replay_video << ".avi";
|
video_name << record_name << "_" << index_replay_video << ".avi";
|
||||||
__LOG_H__ << record_name << "_" << index_replay_video << ".avi";
|
__LOG_CAM__ << record_name << "_" << index_replay_video << ".avi\n";
|
||||||
ReplayInputVideo->release();
|
ReplayInputVideo->release();
|
||||||
ReplayInputVideo->open(video_name.str());
|
ReplayInputVideo->open(video_name.str());
|
||||||
}
|
}
|
||||||
@ -430,7 +442,8 @@ uchar *Webcam::SetFrame(float clock, GS::String record_name , int record_index)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
//force reset if clock not in range
|
//force reset if clock not in range
|
||||||
if(clock < video_times[0] || clock > video_times[video_times.size() -1]){
|
if(clock < video_times[0] || (clock > video_times[video_times.size() -1] && !is_the_last_record)){
|
||||||
|
__LOG_CAM__ << "CLEAR \n";
|
||||||
video_times.clear();
|
video_times.clear();
|
||||||
return SetFrame(clock, record_name , 0);
|
return SetFrame(clock, record_name , 0);
|
||||||
}
|
}
|
||||||
@ -439,26 +452,26 @@ uchar *Webcam::SetFrame(float clock, GS::String record_name , int record_index)
|
|||||||
|
|
||||||
if (it == video_times.begin())
|
if (it == video_times.begin())
|
||||||
{
|
{
|
||||||
// clock before first frame
|
|
||||||
__LOG_CAM__ << "clock before first frame\n";
|
__LOG_CAM__ << "clock before first frame\n";
|
||||||
//SetFrame(clock,record_name-1)
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t index = std::distance(video_times.begin(), it) - 1;
|
size_t index = std::distance(video_times.begin(), it) - 1;
|
||||||
|
|
||||||
if (!ReplayInputVideo || !ReplayInputVideo->isOpened())
|
if (!ReplayInputVideo || !ReplayInputVideo->isOpened())
|
||||||
{
|
{
|
||||||
__LOG_CAM__ << "ReplayInputVideo not opened\n";
|
__LOG_CAM__ << "ReplayInputVideo not opened\n";
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
__LOG_CAM__ << "Index found "<<index<<"for clock "<<clock<<"\n";
|
|
||||||
|
int frameCount = (int)ReplayInputVideo->get(cv::CAP_PROP_FRAME_COUNT) - 1;
|
||||||
ReplayInputVideo->set(cv::CAP_PROP_POS_FRAMES, index);
|
ReplayInputVideo->set(cv::CAP_PROP_POS_FRAMES, index);
|
||||||
|
|
||||||
|
|
||||||
if (!ReplayInputVideo->read(*ReplayImframe))
|
if (!ReplayInputVideo->read(*ReplayImframe))
|
||||||
{
|
{
|
||||||
__LOG_CAM__ << "Failed to read frame at index " << index << "\n";
|
__LOG_CAM__ << "Failed to read frame at index " << index << "\n";
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
cv::cvtColor(*ReplayImframe, *ReplayIm, CV_BGR2RGBA, 4);
|
cv::cvtColor(*ReplayImframe, *ReplayIm, CV_BGR2RGBA, 4);
|
||||||
|
|||||||
@ -71,6 +71,7 @@ private:
|
|||||||
|
|
||||||
int index_save_video;
|
int index_save_video;
|
||||||
int index_replay_video;
|
int index_replay_video;
|
||||||
|
|
||||||
std::vector<float> video_times;
|
std::vector<float> video_times;
|
||||||
cv::VideoCapture *ReplayInputVideo;
|
cv::VideoCapture *ReplayInputVideo;
|
||||||
cv::Mat* ReplayIm;
|
cv::Mat* ReplayIm;
|
||||||
|
|||||||
Reference in New Issue
Block a user