diff --git a/gui/qt/bgslibrary_gui.cpp b/gui/qt/bgslibrary_gui.cpp index ae2721f7c1b13e721812438b9ddd7571204dda60..832c618c8210074299ff9bb28b8a9cbded7a4bc3 100644 --- a/gui/qt/bgslibrary_gui.cpp +++ b/gui/qt/bgslibrary_gui.cpp @@ -3,7 +3,7 @@ int main(int argc, char *argv[]) { std::cout << "--------------------------------------------" << std::endl; - std::cout << "Background Subtraction Library v2.0.0 " << std::endl; + std::cout << "Background Subtraction Library v3.0.0 " << std::endl; std::cout << "https://github.com/andrewssobral/bgslibrary " << std::endl; std::cout << "by: " << std::endl; std::cout << "Andrews Sobral (andrewssobral@gmail.com) " << std::endl; @@ -13,7 +13,7 @@ int main(int argc, char *argv[]) QApplication a(argc, argv); QCoreApplication::setApplicationName("BGSLibrary"); - QCoreApplication::setApplicationVersion("2.0.0"); + QCoreApplication::setApplicationVersion("3.0.0"); MainWindow w; w.show(); diff --git a/gui/qt/bgslibrary_gui.pro b/gui/qt/bgslibrary_gui.pro index 259a1d0a56a8a2a3d082eb7275d0717055e8fa91..7cf92375ecd36fa8c0f5e1299dcc437a085a46cb 100644 --- a/gui/qt/bgslibrary_gui.pro +++ b/gui/qt/bgslibrary_gui.pro @@ -11,18 +11,10 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = bgslibrary_gui TEMPLATE = app -# For Windows x64 + Visual Studio 2015 + OpenCV 3.1.0 -#INCLUDEPATH += C:/OpenCV3.1.0/build/include -#LIBS += -LC:/OpenCV3.1.0/build/x64/vc14/lib -lopencv_world310 - -# For Windows x64 + Visual Studio 2015 + OpenCV 3.2.0 -#INCLUDEPATH += C:/OpenCV3.2.0/build/include -#LIBS += -LC:/OpenCV3.2.0/build/x64/vc14/lib -lopencv_world320 - -# For Windows x64 + Visual Studio 2017 + OpenCV 3.4.2 -INCLUDEPATH += E:/OpenCV3.4.2/build/include -INCLUDEPATH += E:/OpenCV3.4.2/build/include/opencv -LIBS += -LE:/OpenCV3.4.2/build/x64/vc15/lib -lopencv_world342 +# For Windows x64 + Visual Studio 2015 + OpenCV 4.1.1 +INCLUDEPATH += E:/OpenCV/opencv-4.1.1/build/include +Release:LIBS += -LE:/OpenCV/opencv-4.1.1/build/x64/vc14/lib -lopencv_world411 +Debug:LIBS += -LE:/OpenCV/opencv-4.1.1/build/x64/vc14/lib -lopencv_world411d # For Linux # INCLUDEPATH += /usr/local/include/opencv @@ -37,8 +29,6 @@ SOURCES += bgslibrary_gui.cpp\ ../../src/package_analysis/ForegroundMaskAnalysis.cpp \ ../../src/package_analysis/PerformanceUtils.cpp \ ../../src/package_analysis/PixelUtils.cpp \ - ../../src/package_bgs/_template_/Amber.cpp \ - ../../src/package_bgs/_template_/MyBGS.cpp \ ../../src/package_bgs/dp/AdaptiveMedianBGS.cpp \ ../../src/package_bgs/dp/Eigenbackground.cpp \ ../../src/package_bgs/dp/Error.cpp \ @@ -129,8 +119,8 @@ SOURCES += bgslibrary_gui.cpp\ ../../src/package_bgs/VuMeter.cpp \ ../../src/package_bgs/WeightedMovingMean.cpp \ ../../src/package_bgs/WeightedMovingVariance.cpp \ - ../../src/package_bgs/_template_/amber/amber.cpp \ ../../src/package_bgs/CodeBook.cpp + ../../src/package_bgs/_template_/MyBGS.cpp \ HEADERS += mainwindow.h \ qt_utils.h \ @@ -138,9 +128,6 @@ HEADERS += mainwindow.h \ ../../src/package_analysis/ForegroundMaskAnalysis.h \ ../../src/package_analysis/PerformanceUtils.h \ ../../src/package_analysis/PixelUtils.h \ - ../../src/package_bgs/_template_/amber/amber.h \ - ../../src/package_bgs/_template_/Amber.h \ - ../../src/package_bgs/_template_/MyBGS.h \ ../../src/package_bgs/dp/AdaptiveMedianBGS.h \ ../../src/package_bgs/dp/Bgs.h \ ../../src/package_bgs/dp/BgsParams.h \ @@ -244,6 +231,7 @@ HEADERS += mainwindow.h \ ../../src/package_bgs/WeightedMovingMean.h \ ../../src/package_bgs/WeightedMovingVariance.h \ ../../src/package_bgs/CodeBook.h + ../../src/package_bgs/_template_/MyBGS.h \ FORMS += mainwindow.ui diff --git a/gui/qt/mainwindow.cpp b/gui/qt/mainwindow.cpp index f02f3a0a3550f200e367416883e15529991635a1..8565b9282d669112c0aa9a3165aad910f8ab6600 100644 --- a/gui/qt/mainwindow.cpp +++ b/gui/qt/mainwindow.cpp @@ -24,6 +24,7 @@ namespace bgslibrary #if CV_MAJOR_VERSION >= 3 map["KNN"] = &createInstance<KNN>; // only on OpenCV 3.x #endif +#if CV_MAJOR_VERSION >= 2 && CV_MAJOR_VERSION <= 3 map["DPAdaptiveMedian"] = &createInstance<DPAdaptiveMedian>; map["DPGrimsonGMM"] = &createInstance<DPGrimsonGMM>; map["DPZivkovicAGMM"] = &createInstance<DPZivkovicAGMM>; @@ -50,6 +51,7 @@ namespace bgslibrary map["KDE"] = &createInstance<KDE>; map["IndependentMultimodal"] = &createInstance<IndependentMultimodal>; map["MultiCue"] = &createInstance<MultiCue>; +#endif map["SigmaDelta"] = &createInstance<SigmaDelta>; map["SuBSENSE"] = &createInstance<SuBSENSE>; map["LOBSTER"] = &createInstance<LOBSTER>; @@ -80,6 +82,7 @@ namespace bgslibrary #if CV_MAJOR_VERSION >= 3 stringList.append("KNN"); // only on OpenCV 3.x #endif +#if CV_MAJOR_VERSION >= 2 && CV_MAJOR_VERSION <= 3 stringList.append("DPAdaptiveMedian"); stringList.append("DPGrimsonGMM"); stringList.append("DPZivkovicAGMM"); @@ -106,6 +109,7 @@ namespace bgslibrary stringList.append("KDE"); stringList.append("IndependentMultimodal"); stringList.append("MultiCue"); +#endif stringList.append("SigmaDelta"); stringList.append("SuBSENSE"); stringList.append("LOBSTER"); @@ -128,7 +132,7 @@ MainWindow::MainWindow(QWidget *parent) : ui->lineEdit_inputdata->setText(fileName); //fileName = ui->lineEdit_inputdata->text(); timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(startCapture())); - QStringListModel* listModel = new QStringListModel(bgslibrary::get_algs_name(), NULL); + QStringListModel* listModel = new QStringListModel(bgslibrary::get_algs_name(), nullptr); listModel->sort(0); ui->listView_algorithms->setModel(listModel); QModelIndex index = listModel->index(0); @@ -285,7 +289,7 @@ void MainWindow::setFrameNumber(long long _frameNumber) { //std::cout << "setFrameNumber()" << std::endl; frameNumber = _frameNumber; - QString txt_frameNumber = QString::fromStdString(its(frameNumber)); + QString txt_frameNumber = QString::fromStdString(to_string(frameNumber)); ui->label_framenumber_txt->setText(txt_frameNumber); } @@ -309,12 +313,12 @@ bool MainWindow::setUpCapture() } if (useCamera || useVideo) { - int capture_fps = capture.get(CV_CAP_PROP_FPS); + int capture_fps = static_cast<int>(capture.get(CV_CAP_PROP_FPS)); std::cout << "capture_fps: " << capture_fps << std::endl; } if (useVideo) { - capture_length = capture.get(CV_CAP_PROP_FRAME_COUNT); + capture_length = static_cast<int>(capture.get(CV_CAP_PROP_FRAME_COUNT)); std::cout << "capture_length: " << capture_length << std::endl; } @@ -333,7 +337,7 @@ void MainWindow::startCapture() if (useSequence && (frameNumber - 1) < entryList.length()) { - QString file = entryList.at(frameNumber - 1); + QString file = entryList.at(static_cast<int>(frameNumber - 1)); QString filePath = QDir(fileName).filePath(file); std::cout << "Processing: " << filePath.toStdString() << std::endl; @@ -351,15 +355,15 @@ void MainWindow::startCapture() { int frame_width = cv_frame.size().width; int frame_height = cv_frame.size().height; - ui->label_frameresw_txt->setText(QString::fromStdString(its(frame_width))); - ui->label_frameresh_txt->setText(QString::fromStdString(its(frame_height))); + ui->label_frameresw_txt->setText(QString::fromStdString(to_string(frame_width))); + ui->label_frameresh_txt->setText(QString::fromStdString(to_string(frame_height))); } if (useVideo && capture_length > 0) { double perc = (double(frameNumber) / double(capture_length)) * 100.0; //std::cout << "perc: " << perc << std::endl; - ui->progressBar->setValue(perc); + ui->progressBar->setValue(static_cast<int>(perc)); } int startAt = ui->spinBox_startat->value(); @@ -402,7 +406,7 @@ void MainWindow::processFrame(const cv::Mat &cv_frame) tic(); bgs->process(cv_frame, cv_fg, cv_bg); toc(); - ui->label_fps_txt->setText(QString::fromStdString(its(fps()))); + ui->label_fps_txt->setText(QString::fromStdString(to_string(fps()))); cv::Mat cv_fg_small; cv::resize(cv_fg, cv_fg_small, cv::Size(250, 250)); diff --git a/gui/qt/mainwindow.h b/gui/qt/mainwindow.h index 4ed6d35ff606f144647ecc32f7ece654fd710e9d..fdb0c4b067a1a14a1007fc35d1d379f042f04203 100644 --- a/gui/qt/mainwindow.h +++ b/gui/qt/mainwindow.h @@ -15,6 +15,15 @@ #include <QCollator> #include <opencv2/opencv.hpp> +//#include <opencv2/imgproc/types_c.h> +//#include <opencv2/imgproc/imgproc_c.h> +//#include <opencv2/highgui/highgui_c.h> + +#if CV_MAJOR_VERSION >= 4 +#define CV_CAP_PROP_POS_FRAMES cv::CAP_PROP_POS_FRAMES +#define CV_CAP_PROP_FRAME_COUNT cv::CAP_PROP_FRAME_COUNT +#define CV_CAP_PROP_FPS cv::CAP_PROP_FPS +#endif #include "qt_utils.h" #include "texteditor.h" @@ -38,7 +47,7 @@ class MainWindow : public QMainWindow Q_OBJECT public: - explicit MainWindow(QWidget *parent = 0); + explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: diff --git a/gui/qt/qt_utils.cpp b/gui/qt/qt_utils.cpp index 8acc6fefbe126b63dc3f98b4c7920805edd7e3fe..4f9ef4b2042629bc31afba3e5182f0171d4637d7 100644 --- a/gui/qt/qt_utils.cpp +++ b/gui/qt/qt_utils.cpp @@ -3,19 +3,21 @@ QImage GrayMat2QImage(cv::Mat const& src) { cv::Mat temp; src.copyTo(temp); - QImage dest((const uchar *)temp.data, temp.cols, temp.rows, temp.step, QImage::Format_Indexed8); + QImage dest((const uchar *)temp.data, temp.cols, temp.rows, static_cast<int>(temp.step), QImage::Format_Indexed8); dest.bits(); return dest; } + QImage Mat2QImage(cv::Mat const& src) { cv::Mat temp; cvtColor(src, temp, CV_BGR2RGB); - QImage dest((const uchar *)temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888); + QImage dest((const uchar *)temp.data, temp.cols, temp.rows, static_cast<int>(temp.step), QImage::Format_RGB888); dest.bits(); return dest; } + cv::Mat QImage2Mat(QImage const& src) { - cv::Mat tmp(src.height(), src.width(), CV_8UC3, (uchar*)src.bits(), src.bytesPerLine()); + cv::Mat tmp(src.height(), src.width(), CV_8UC3, (uchar*)src.bits(), static_cast<size_t>(src.bytesPerLine())); cv::Mat result; cvtColor(tmp, result, CV_RGB2BGR); return result; @@ -26,29 +28,38 @@ QString base64_encode(const QString string) { ba.append(string); return ba.toBase64(); } + QString base64_decode(const QString string) { QByteArray ba; ba.append(string); return QByteArray::fromBase64(ba); } + QString md5_encode(const QString string) { QByteArray ba; ba.append(string); return QString(QCryptographicHash::hash((ba), QCryptographicHash::Md5).toHex()); } -int sti(const std::string &s) { +int str2int(const std::string &s) { int i; std::stringstream ss; ss << s; ss >> i; return i; } -std::string its(int i) { + +template<typename T> +std::string to_string(T t) { std::stringstream ss; - ss << i; + ss << t; return ss.str(); } +template std::string to_string<double>(double); +template std::string to_string<int>(int); +template std::string to_string<size_t>(size_t); +template std::string to_string<long>(long); +template std::string to_string<long long>(long long); bool fileExists(QString path) { QFileInfo check_file(path); diff --git a/gui/qt/qt_utils.h b/gui/qt/qt_utils.h index 2233f3ca49358534cd15b731137752a7240b66e8..e690143a867365081fddf30c5287d5c86d265393 100644 --- a/gui/qt/qt_utils.h +++ b/gui/qt/qt_utils.h @@ -2,11 +2,14 @@ #include <sstream> #include <string> + #include <QByteArray> #include <QImage> #include <QCryptographicHash> #include <QFileInfo> + #include <opencv2/opencv.hpp> +#include <opencv2/imgproc/types_c.h> QImage GrayMat2QImage(cv::Mat const& src); QImage Mat2QImage(cv::Mat const& src); @@ -16,8 +19,10 @@ QString base64_encode(const QString string); QString base64_decode(const QString string); QString md5_encode(const QString); -int sti(const std::string &s); -std::string its(int i); +int str2int(const std::string &s); + +template<typename T> +std::string to_string(T t); bool fileExists(QString path); diff --git a/src/PreProcessor.h b/src/PreProcessor.h index ad2f5343d166ee0c0c062e2816e949c1b0a0e379..b0ee9f47c3c3f38d192c972315b17f92b8f6871c 100644 --- a/src/PreProcessor.h +++ b/src/PreProcessor.h @@ -7,8 +7,8 @@ #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/features2d/features2d.hpp> #include <opencv2/imgproc/types_c.h> -#include <opencv2/imgproc/imgproc_c.h> -#include <opencv2/highgui/highgui_c.h> +//#include <opencv2/imgproc/imgproc_c.h> +//#include <opencv2/highgui/highgui_c.h> #include "package_bgs/ILoadSaveConfig.h" diff --git a/src/package_bgs/_template_/Amber.cpp b/src/package_bgs/_template_/Amber.cpp deleted file mode 100644 index 10ce09c86d945b912dcc8d0d59b1ca609c3cb801..0000000000000000000000000000000000000000 --- a/src/package_bgs/_template_/Amber.cpp +++ /dev/null @@ -1,96 +0,0 @@ -#include "Amber.h" - -using namespace bgslibrary::algorithms; - -Amber::Amber() : model(nullptr) -{ - std::cout << "Amber()" << std::endl; - /* Initialization of the Amber model */ - model = libamberModelNew(); - setup("./config/Amber.xml"); -} - -Amber::~Amber() -{ - std::cout << "~Amber()" << std::endl; - libamberModelFree(model); -} - -void Amber::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel) -{ - init(img_input, img_output, img_bgmodel); - - if (img_input.empty()) - return; - - // Start the initialization - unsigned int width = img_input.cols; - unsigned int height = img_input.rows; - - if (img_input.channels() != 3) - { - std::cout << "Only works for 3 channels images. Sorry for that" << std::endl; - return; - } - - //unsigned int stride = width * 3; - unsigned char* image = static_cast<unsigned char*>(img_input.data); - - if (firstTime) - { - /* Create a buffer for the output image */ - //img_output = Mat(img_input.rows, img_input.cols, CV_8UC1); - - /* Sets default model values */ - // libamberModelSetNumberOfSamples(model, nbSamples); - // libamberModelSetMatchingThreshold(model, matchingThreshold); - // libamberModelSetMatchingNumber(model, matchingNumber); - // libamberModelSetUpdateFactor(model, init_subsamplingFactor); - // libamberModelPrintParameters(model); - - /* Initiliazes the Amber model */ - libamberModelAllocInit_8u_C3R(model, image, width, height); - } - - /* Create temporary buffers */ - unsigned char* output_segmentationMap = static_cast<unsigned char*>(calloc(width * height, sizeof(unsigned char))); - libamberGetSegmentation_8u_C3R(model, image, output_segmentationMap); - - unsigned char* oBuffer = static_cast<unsigned char*>(img_output.data); - unsigned char* tmpSegmentationMap = output_segmentationMap; - - for (unsigned int i = 0; i < width * height; i++) - { - *oBuffer = *tmpSegmentationMap; - - ++oBuffer; - ++tmpSegmentationMap; - } - -#ifndef MEX_COMPILE_FLAG - if (showOutput) - imshow("Amber", img_output); -#endif - - firstTime = false; - free(output_segmentationMap); -} - -void Amber::saveConfig() -{ - cv::FileStorage fs(config_xml, cv::FileStorage::WRITE); - - fs << "showOutput" << showOutput; - - fs.release(); -} - -void Amber::loadConfig() -{ - cv::FileStorage fs; - fs.open(config_xml, cv::FileStorage::READ); - - fs["showOutput"] >> showOutput; - - fs.release(); -} diff --git a/src/package_bgs/_template_/Amber.h b/src/package_bgs/_template_/Amber.h deleted file mode 100644 index b0af8658d8a101b02e4163dfca75ccaea9f6eff5..0000000000000000000000000000000000000000 --- a/src/package_bgs/_template_/Amber.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include <math.h> -#include <sys/types.h> - -#include "../IBGS.h" -#include "../ILoadSaveConfig.h" -#include "amber/amber.h" - -namespace bgslibrary -{ - namespace algorithms - { - class Amber : public IBGS, public ILoadSaveConfig - { - private: - amberModel* model; - - public: - Amber(); - ~Amber(); - - void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel); - - private: - void saveConfig(); - void loadConfig(); - }; - - static BGS_Register<Amber> register_Amber("Amber"); - } -} diff --git a/src/package_bgs/_template_/amber/amber.cpp b/src/package_bgs/_template_/amber/amber.cpp deleted file mode 100644 index 956c04106a1ef7362a5a2a1477f69114cd6102c2..0000000000000000000000000000000000000000 --- a/src/package_bgs/_template_/amber/amber.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include "amber.h" - -#define COLOR_BACKGROUND 0 -#define COLOR_FOREGROUND 255 - -amberModel* libamberModelNew() -{ - /* model structure alloc */ - amberModel* model = NULL; - model = (amberModel*)calloc(1, sizeof(amberModel)); - assert(model != NULL); - - /* default parameters values */ - model->height = 0; - - return(model); -} - -// -------------------------------------------------- -int32_t libamberModelAllocInit_8u_C3R(amberModel* model, - const uint8_t *image_data, - const uint32_t width, - const uint32_t height) -{ - - /* basic checks */ - assert((image_data != NULL) && (model != NULL)); - assert((model->width > 0) && (model->height > 0)); - - /* finish model alloc - parameters values cannot be changed anymore */ - model->width = width; - model->height = height; - - return(0); -} - -// -------------------------------------------------- -int32_t libamberGetSegmentation_8u_C3R(amberModel* model, - const uint8_t *image_data, - uint8_t *segmentation_map) -{ - /* basic checks */ - assert((image_data != NULL) && (model != NULL) && (segmentation_map != NULL)); - assert((model->width > 0) && (model->height > 0)); - - return(0); -} - -// -------------------------------------------------- -int32_t libamberModelFree(amberModel* model) -{ - if (model == NULL) - return(-1); - - free(model); - - return(0); -} diff --git a/src/package_bgs/_template_/amber/amber.h b/src/package_bgs/_template_/amber/amber.h deleted file mode 100644 index 1ebda54d9ff2c369d663d9fa4bda716d0a99f9e3..0000000000000000000000000000000000000000 --- a/src/package_bgs/_template_/amber/amber.h +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include <stdlib.h> -#include <stdio.h> -#include <assert.h> - -#define COLOR_BACKGROUND 0 -#define COLOR_FOREGROUND 255 - -/* For compilation with g++ */ -#ifdef __cplusplus -extern "C" -{ -#endif - /* end of addition for compilation with g++ */ - -#ifndef _STDINT_H -// This is used to make it compatible for cross-compilation - typedef unsigned char uint8_t; - typedef int int32_t; - typedef unsigned int uint32_t; -#endif // _STDINT_H - - typedef struct { - uint32_t width; - uint32_t height; - } amberModel; - - /** Allocation of a new data structure where the background model - will be stored */ - amberModel* libamberModelNew(); - - int32_t libamberModelAllocInit_8u_C3R(amberModel* model, - const uint8_t *image_data, - const uint32_t width, - const uint32_t height); - - int32_t libamberGetSegmentation_8u_C3R(amberModel* model, - const uint8_t *image_data, - uint8_t *segmentation_map); - - - int32_t libamberModelFree(amberModel* model); - - /* For compilation with g++ */ -#ifdef __cplusplus -} -#endif