From 028660d851b15e25a716e10ad5dca54a11a18fe1 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 18 Aug 2015 16:37:37 +0300 Subject: [PATCH] feature_change_position --- sample_mahnev/CMakeLists.txt | 7 ++ sample_mahnev/application.cpp | 123 ++++++++++++++++++++++++++++++++++ sample_mahnev/application.hpp | 49 ++++++++++++++ sample_mahnev/main.cpp | 46 +++++++++++++ sample_mahnev/processing.cpp | 21 ++++++ sample_mahnev/processing.hpp | 9 +++ 6 files changed, 255 insertions(+) create mode 100644 sample_mahnev/CMakeLists.txt create mode 100644 sample_mahnev/application.cpp create mode 100644 sample_mahnev/application.hpp create mode 100644 sample_mahnev/main.cpp create mode 100644 sample_mahnev/processing.cpp create mode 100644 sample_mahnev/processing.hpp diff --git a/sample_mahnev/CMakeLists.txt b/sample_mahnev/CMakeLists.txt new file mode 100644 index 0000000..7f5f327 --- /dev/null +++ b/sample_mahnev/CMakeLists.txt @@ -0,0 +1,7 @@ +set(target "sample_mahnev") + +file(GLOB hdrs "*.hpp") +file(GLOB srcs "*.cpp") + +add_executable(${target} ${srcs} ${hdrs}) +target_link_libraries(${target} ${LIBRARY_DEPS}) diff --git a/sample_mahnev/application.cpp b/sample_mahnev/application.cpp new file mode 100644 index 0000000..4cc18d1 --- /dev/null +++ b/sample_mahnev/application.cpp @@ -0,0 +1,123 @@ +#include "application.hpp" +#include "processing.hpp" + +#include + +using namespace cv; + +int Application::parseArguments(int argc, const char **argv, + Application::Parameters ¶ms) +{ + if (argc < 2) + { + return 1; + } + params.imgFileName = std::string(argv[1]); + return 0; +} + +int Application::getFrame(const std::string &fileName, Mat& src) +{ + src = imread(fileName); + if (src.empty()) + { + return 1; + } + return 0; +} + +int Application::processFrame(const Mat& src, Mat& dst) +{ + processor.processFrame(src, dst); + + if (dst.empty()) + { + return 1; + } + + return 0; +} + +int Application::drawButtons(Mat &display) +{ + guiState.onButtonPlace = Rect(20, display.rows - 60, 120, 40); + guiState.offButtonPlace = Rect(160, display.rows - 60, 120, 40); + rectangle(display, guiState.onButtonPlace, + Scalar(128, 128, 128), CV_FILLED); + rectangle(display, guiState.offButtonPlace, + Scalar(128, 128, 128), CV_FILLED); + + putText(display, "on", + Point(guiState.onButtonPlace.x + guiState.onButtonPlace.width / 2 - 15, + guiState.onButtonPlace.y + guiState.onButtonPlace.height / 2 + 10), + FONT_HERSHEY_SIMPLEX, 1.0, Scalar(0, 0, 0), 2); + putText(display, "off", + Point(guiState.offButtonPlace.x + guiState.offButtonPlace.width / 2 - 20, + guiState.offButtonPlace.y + guiState.offButtonPlace.height / 2 + 10), + FONT_HERSHEY_SIMPLEX, 1.0, Scalar(0, 0, 0), 2); + + return 0; +} + +int Application::showFrame(const std::string &caption, + const Mat& src, Mat& dst) +{ + if (guiState.state == OffFilter) + { + src.copyTo(dst); + } + else if (guiState.state == OnFilter) + { + processFrame(src, dst); + } + else + { + return 1; + } + + Mat display(src.rows, src.cols + dst.cols, src.type()); + Mat srcRoi = display(Rect(0, 0, src.cols, src.rows)); + src.copyTo(srcRoi); + Mat dstRoi = display(Rect(src.cols, 0, dst.cols, dst.rows)); + dst.copyTo(dstRoi); + + drawButtons(display); + + namedWindow(caption); + imshow(caption, display); + setMouseCallback(caption, onButtonsOnOffClick, &guiState); + char key = waitKey(1); + + return key; +} + +void onButtonsOnOffClick(int eventId, int x, int y, int flags, void *userData) +{ + if (eventId != EVENT_LBUTTONDOWN) + { + return; + } + Application::GUIElementsState *elems = + (Application::GUIElementsState *)userData; + if (onButtonClicked(elems->onButtonPlace, x, y)) + { + elems->state = Application::OnFilter; + return; + } + if (onButtonClicked(elems->offButtonPlace, x, y)) + { + elems->state = Application::OffFilter; + return; + } +} + +bool onButtonClicked(cv::Rect buttonPlace, int x, int y) +{ + if (x < buttonPlace.x || x > buttonPlace.x + buttonPlace.width || + y < buttonPlace.y || y > buttonPlace.y + buttonPlace.height) + { + return false; + } + return true; +} + diff --git a/sample_mahnev/application.hpp b/sample_mahnev/application.hpp new file mode 100644 index 0000000..862cc3f --- /dev/null +++ b/sample_mahnev/application.hpp @@ -0,0 +1,49 @@ +#pragma once + +#include +#include +#include + +#include "processing.hpp" + +bool onButtonClicked(cv::Rect buttonPlace, int x, int y); +void onButtonsOnOffClick(int eventId, int x, int y, int flags, void *userData); + +class Application +{ + public: + enum WindowState + { + OnFilter, + OffFilter + }; + struct Parameters + { + std::string imgFileName; + }; + struct GUIElementsState + { + WindowState state; + cv::Rect onButtonPlace; + cv::Rect offButtonPlace; + }; + int parseArguments(int argc, const char **argv, Parameters ¶ms); + int getFrame(const std::string &fileName, cv::Mat& src); + int processFrame(const cv::Mat& src, cv::Mat& dst); + int showFrame(const std::string &caption, + const cv::Mat& src, cv::Mat& dst); + friend void onButtonsOnOffClick(int eventId, int x, int y, + int flags, void *userData); + Application() + { + guiState.state = OnFilter; + }; + + private: + Processing processor; + GUIElementsState guiState; + + int drawButtons(cv::Mat &display); + + friend bool onButtonClicked(cv::Rect buttonPlace, int x, int y); +}; diff --git a/sample_mahnev/main.cpp b/sample_mahnev/main.cpp new file mode 100644 index 0000000..212cc37 --- /dev/null +++ b/sample_mahnev/main.cpp @@ -0,0 +1,46 @@ +#include +#include + +#include "application.hpp" + +using namespace std; +using namespace cv; + +enum ErrorCode { + OK, + WRONG_ARGUMENTS, + WRONG_INPUT, + CANT_PROCESS +}; + +int main(int argc, const char **argv) +{ + Application app; + Application::Parameters params; + + + if (app.parseArguments(argc, argv, params) != 0) + { + cout << "sample_template " << endl; + cout << " - image name for filtering" << endl; + return WRONG_ARGUMENTS; + } + + Mat src; + if (app.getFrame(params.imgFileName, src) != 0) + { + cout << "Error: \'src\' image is null or empty!" << endl; + return WRONG_INPUT; + } + + const std::string caption = "OpenCV Sample"; + char key = 0; + Mat dst(src.rows, src.cols, src.type()); + while (key != 27) // Esc + { + + key = app.showFrame(caption, src, dst); + } + + return OK; +} diff --git a/sample_mahnev/processing.cpp b/sample_mahnev/processing.cpp new file mode 100644 index 0000000..9c7ba24 --- /dev/null +++ b/sample_mahnev/processing.cpp @@ -0,0 +1,21 @@ +#include "processing.hpp" +#include +#include +#include +using namespace cv; + +void Processing::processFrame(const cv::Mat& src, cv::Mat& dst) +{ + srand(time(NULL)); + src.copyTo(dst); + int line = rand() % src.rows / 2; + int point = rand() % src.cols / 2; + + cv::Rect region( line, point, src.rows/2, src.cols/2); + Mat roi = dst(region); + + const int kSize = 11; + medianBlur(roi, roi, kSize); + + rectangle(dst, region, Scalar(255, 0, 0)); +} diff --git a/sample_mahnev/processing.hpp b/sample_mahnev/processing.hpp new file mode 100644 index 0000000..65f29fc --- /dev/null +++ b/sample_mahnev/processing.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include + +class Processing +{ + public: + void processFrame(const cv::Mat& src, cv::Mat& dst); +};