You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
1.8 KiB
C++
95 lines
1.8 KiB
C++
#ifndef SAVE_THREAD_H
|
|
#define SAVE_THREAD_H
|
|
#include <QThread>
|
|
#include <QDebug>
|
|
#include <QDateTime>
|
|
#include "SyncQueue.h"
|
|
#include "common.h"
|
|
#include <iostream>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <qdir.h>
|
|
|
|
#include <opencv2/opencv.hpp>
|
|
#include <opencv2/imgproc/types_c.h>
|
|
|
|
class SaveThread : public QThread
|
|
{
|
|
Q_OBJECT
|
|
signals:
|
|
|
|
|
|
public:
|
|
SaveThread(QObject *parent = 0): QThread(parent)
|
|
{
|
|
|
|
}
|
|
~SaveThread()
|
|
{
|
|
stop();
|
|
p_save_queue->put(std::make_pair("", cv::Mat()));
|
|
quit();
|
|
wait();
|
|
}
|
|
|
|
void init(SyncQueue<std::pair<std::string, cv::Mat> > *p_save_queue_)
|
|
{
|
|
p_save_queue = p_save_queue_;
|
|
b_quit = false;
|
|
}
|
|
void start_work()
|
|
{
|
|
start(HighestPriority);
|
|
}
|
|
void stop()
|
|
{
|
|
b_quit = true;
|
|
}
|
|
protected:
|
|
void run()
|
|
{
|
|
while (!b_quit) {
|
|
cv::Mat image;
|
|
std::pair<std::string, cv::Mat> element;
|
|
p_save_queue->take(element);
|
|
std::string file_name = element.first;
|
|
//std::cout << file_name << std::endl;
|
|
image = element.second;
|
|
if (image.data)
|
|
{
|
|
std::size_t found = file_name.find_last_of("/\\");
|
|
std::string dir_path = file_name.substr(0, found);
|
|
check_save_dir(dir_path);
|
|
bool b_save = cv::imwrite(file_name, image);
|
|
}
|
|
}
|
|
}
|
|
void check_save_dir(std::string dir_path)
|
|
{
|
|
bool b_find = false;
|
|
for (int i = 0; i < vec_save_dirs.size(); i++)
|
|
{
|
|
if (dir_path == vec_save_dirs[i])
|
|
{
|
|
b_find = true;
|
|
}
|
|
}
|
|
if (!b_find)
|
|
{
|
|
QString dir_str = QString::fromStdString(dir_path);
|
|
QDir dir;
|
|
if (!dir.exists(dir_str))
|
|
{
|
|
dir.mkpath(dir_str);
|
|
}
|
|
vec_save_dirs.push_back(dir_path);
|
|
}
|
|
}
|
|
public:
|
|
bool b_quit;
|
|
std::vector<std::string> vec_save_dirs;
|
|
SyncQueue<std::pair<std::string, cv::Mat> > *p_save_queue;
|
|
};
|
|
#endif
|