Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ set(LIBRARY_DEPS ${OpenCV_LIBS})

# BUILD
add_subdirectory(sample_template)
add_subdirectory(sample_Moskalenko)
# Add you directory here
# add_subdirectory(sample_YOUR_NAME)

Expand Down
7 changes: 7 additions & 0 deletions sample_Moskalenko/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
set(target "sample_Moskalenko")

file(GLOB hdrs "*.hpp")
file(GLOB srcs "*.cpp")

add_executable(${target} ${srcs} ${hdrs})
target_link_libraries(${target} ${LIBRARY_DEPS})
123 changes: 123 additions & 0 deletions sample_Moskalenko/application.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
#include "application.hpp"
#include "processing.hpp"

#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int Application::parseArguments(int argc, const char **argv,
Application::Parameters &params)
{
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;
}

49 changes: 49 additions & 0 deletions sample_Moskalenko/application.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#pragma once

#include <string>
#include <iostream>
#include <opencv2/core/core.hpp>

#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 &params);
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);
};
44 changes: 44 additions & 0 deletions sample_Moskalenko/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#include <opencv2/core/core.hpp>
#include <iostream>

#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 <image_name>" << endl;
cout << "<image_name> - 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;
}
18 changes: 18 additions & 0 deletions sample_Moskalenko/processing.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#include "processing.hpp"

#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;

void Processing::processFrame(const cv::Mat& src, cv::Mat& dst)
{
src.copyTo(dst);

cv::Rect region(src.rows/4, src.cols/4, 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));
}
9 changes: 9 additions & 0 deletions sample_Moskalenko/processing.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#pragma once

#include <opencv2/core/core.hpp>

class Processing
{
public:
void processFrame(const cv::Mat& src, cv::Mat& dst);
};
2 changes: 2 additions & 0 deletions sample_template/application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

using namespace cv;

bool testfunction() { return true; }

int Application::parseArguments(int argc, const char **argv,
Application::Parameters &params)
{
Expand Down
9 changes: 8 additions & 1 deletion sample_template/processing.cpp
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
#include "processing.hpp"

#include <time.h>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;
using namespace std;

void Processing::processFrame(const cv::Mat& src, cv::Mat& dst)
{
src.copyTo(dst);

cv::Rect region(src.rows/4, src.cols/4, src.rows/2, src.cols/2);
time_t t;
t = time(0);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MoskalenkoViktor, надо заменить табуляцию на пробелы.


//cv::Rect region(src.rows/4, src.cols/4, src.rows/2, src.cols/2);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MoskalenkoViktor, надо удалить ненужные комментарии.

int a = clock()/100;
cv::Rect region((a*a)%(src.rows/2 - 1), a%(src.cols/2 - 1), src.rows/2, src.cols/2);
Mat roi = dst(region);

const int kSize = 11;
Expand Down