Skip to content

Commit d44e7f6

Browse files
committed
Add grayscale image filter
1 parent f8715c3 commit d44e7f6

File tree

7 files changed

+82
-12
lines changed

7 files changed

+82
-12
lines changed

CMakeLists.txt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ add_executable(self_o_mat.app
7272
src/tools/readfile.cpp
7373
src/tools/cobs.cpp src/logic/SelfomatController.cpp
7474
src/logic/filters/BasicImageFilter.cpp
75+
src/logic/filters/GrayscaleImageFilter.cpp
7576
src/logic/filters/IImageFilter.cpp
7677
src/tools/verbose.cpp)
7778

@@ -91,7 +92,13 @@ target_link_libraries(self_o_mat.app ${Boost_LIBRARIES}
9192
spdlog::spdlog
9293
)
9394

94-
add_executable(filter_test src/main_filter.cpp src/logic/filters/IImageFilter.h src/logic/filters/BasicImageFilter.cpp src/logic/filters/BasicImageFilter.h src/logic/filters/IImageFilter.cpp)
95+
add_executable(filter_test src/main_filter.cpp
96+
src/logic/filters/IImageFilter.h
97+
src/logic/filters/BasicImageFilter.cpp
98+
src/logic/filters/BasicImageFilter.h
99+
src/logic/filters/GrayscaleImageFilter.cpp
100+
src/logic/filters/GrayscaleImageFilter.h
101+
src/logic/filters/IImageFilter.cpp)
95102
target_link_libraries(filter_test ${Boost_LIBRARIES})
96103
target_link_libraries(filter_test ${OpenCV_LIBS})
97104

@@ -107,4 +114,4 @@ add_custom_target(WITH_APP /bin/sh ${CMAKE_CURRENT_SOURCE_DIR}/deploy_app.sh ${C
107114
add_custom_target(PACK /bin/sh ${CMAKE_CURRENT_SOURCE_DIR}/pack.sh ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
108115

109116
add_dependencies(PACK self_o_mat.app)
110-
add_dependencies(self_o_mat.app WITH_APP)
117+
add_dependencies(self_o_mat.app WITH_APP)

src/logic/BoothLogic.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,8 @@ void BoothLogic::printerThread() {
389389
saveImage(latestJpegBuffer, latestJpegBufferSize, latestJpegFileName, false, true);
390390

391391
cv::Mat toPrepare;
392+
int filterChoice = getFilterChoice();
393+
LOG_D(TAG, "[Printer Thread] Filter choice (numeric): ", std::to_string(filterChoice));
392394
if (templateEnabled) {
393395
toPrepare = imageProcessor.frameImageForPrint(latestJpegBuffer, latestJpegBufferSize, getFilter(),
394396
filterGain);
@@ -954,6 +956,8 @@ FILTER BoothLogic::getFilter() {
954956
return NO_FILTER;
955957
case 1:
956958
return BASIC_FILTER;
959+
case 2:
960+
return GRAYSCALE_FILTER;
957961
}
958962
return NO_FILTER;
959963
}

src/logic/ImageProcessor.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,10 @@ void ImageProcessor::applyFilter(cv::Mat &image, FILTER filter, double gain) {
324324
LOG_D(TAG, "basic filter with gain: ", std::to_string(gain));
325325
basicFilter.processImage(image, gain);
326326
break;
327+
case GRAYSCALE_FILTER:
328+
LOG_D(TAG, "grayscale filter");
329+
grayscaleFilter.processImage(image, gain);
330+
break;
327331
default:
328332
LOG_D(TAG, "No Filter");
329333
break;

src/logic/ImageProcessor.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <tools/JpegDecoder.h>
1616
#include <opencv2/opencv.hpp>
1717
#include "logic/filters/BasicImageFilter.h"
18+
#include "logic/filters/GrayscaleImageFilter.h"
1819

1920

2021
using namespace selfomat::tools;
@@ -24,10 +25,11 @@ namespace selfomat {
2425

2526
enum FILTER {
2627
NO_FILTER = 0,
27-
BASIC_FILTER = 1
28+
BASIC_FILTER = 1,
29+
GRAYSCALE_FILTER = 2
2830
};
2931

30-
const std::vector<std::string> filterNames { "No Filter", "Basic Filter" };
32+
const std::vector<std::string> filterNames { "No Filter", "Basic Filter", "Grayscale Filter" };
3133

3234
class ImageProcessor {
3335
private:
@@ -45,6 +47,7 @@ namespace selfomat {
4547
void writeOffset(cv::Rect offset, std::string filename);
4648

4749
BasicImageFilter basicFilter;
50+
GrayscaleImageFilter grayscaleFilter;
4851

4952
void applyFilter(cv::Mat &image, FILTER filter, double gain);
5053

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//
2+
// Created by maehw on 08.03.2025
3+
//
4+
5+
#include "GrayscaleImageFilter.h"
6+
7+
using namespace selfomat::logic;
8+
9+
void GrayscaleImageFilter::processImage(cv::Mat &image, double gain) {
10+
// Ignore the gain parameter
11+
(void)gain;
12+
13+
// Convert the color image to grayscale
14+
cv::Mat grayImage;
15+
cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);
16+
17+
// Clip pixel values to the valid range [0, 255]
18+
cv::threshold(grayImage, grayImage, 255, 255, cv::THRESH_TRUNC);
19+
20+
// Convert grayscale image back to 3-channel format to maintain consistency
21+
cv::cvtColor(grayImage, image, cv::COLOR_GRAY2BGR);
22+
}
23+
24+
std::string GrayscaleImageFilter::getName() {
25+
return "grayscale_image_filter";
26+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//
2+
// Created by maehw on 08.03.2025.
3+
//
4+
5+
#ifndef SELF_O_MAT_GRAYSCALEIMAGEFILTER_H
6+
#define SELF_O_MAT_GRAYSCALEIMAGEFILTER_H
7+
8+
9+
#include "IImageFilter.h"
10+
#include <iostream>
11+
12+
namespace selfomat {
13+
namespace logic {
14+
class GrayscaleImageFilter : public IImageFilter {
15+
public:
16+
std::string getName() override;
17+
18+
void processImage(cv::Mat &image, double gain) override;
19+
};
20+
21+
}
22+
}
23+
24+
25+
#endif //SELF_O_MAT_GRAYSCALEIMAGEFILTER_H

src/main_filter.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include <vector>
22
#include <logic/filters/IImageFilter.h>
33
#include <logic/filters/BasicImageFilter.h>
4+
#include <logic/filters/GrayscaleImageFilter.h>
45
#include <iostream>
56
#include <boost/filesystem.hpp>
67
#include <string>
@@ -12,15 +13,13 @@ using namespace boost::filesystem;
1213
int main(int argc, char *argv[]) {
1314

1415
if(argc != 2) {
15-
std::cout << "Usage: ./filter_test <image in dir> <image out dir>" << std::endl;
16+
std::cout << "Usage: ./filter_test <image in dir>" << std::endl;
1617
return 1;
1718
}
1819

19-
20-
21-
2220
std::vector<IImageFilter*> filters;
2321
filters.push_back(new BasicImageFilter());
22+
filters.push_back(new GrayscaleImageFilter());
2423

2524
path p(argv[1]);
2625
directory_iterator end_itr;
@@ -50,7 +49,9 @@ int main(int argc, char *argv[]) {
5049

5150

5251
for(auto &filter : filters) {
52+
printf("running filter %s\n", filter->getName().c_str());
5353
for(double d = 0.0; d <= 1.0; d+=0.25) {
54+
printf("d = %.2lf\n", d);
5455
clock_gettime(CLOCK_MONOTONIC, &tstart);
5556
image = cv::imread(current_file);
5657

@@ -60,7 +61,7 @@ int main(int argc, char *argv[]) {
6061

6162
clock_gettime(CLOCK_MONOTONIC, &tend);
6263

63-
printf("loading took %.5f s\n",
64+
printf("loading took %.5lf s\n",
6465
((double)tend.tv_sec + 1.0e-9*tend.tv_nsec) -
6566
((double)tstart.tv_sec + 1.0e-9*tstart.tv_nsec));
6667
clock_gettime(CLOCK_MONOTONIC, &tstart);
@@ -71,7 +72,7 @@ int main(int argc, char *argv[]) {
7172
filter->processImage(image, d);
7273
clock_gettime(CLOCK_MONOTONIC, &tend);
7374

74-
printf("filtering took %.5f s\n",
75+
printf("filtering took %.5lf s\n",
7576
((double)tend.tv_sec + 1.0e-9*tend.tv_nsec) -
7677
((double)tstart.tv_sec + 1.0e-9*tstart.tv_nsec));
7778

@@ -85,10 +86,10 @@ int main(int argc, char *argv[]) {
8586
}
8687
clock_gettime(CLOCK_MONOTONIC, &tend);
8788

88-
printf("filtering took %.5f s\n",
89+
printf("overall filtering took %.5lf s\n",
8990
((double)tend.tv_sec + 1.0e-9*tend.tv_nsec) -
9091
((double)tstart.tv_sec + 1.0e-9*tstart.tv_nsec));
9192

9293
}
9394
}
94-
}
95+
}

0 commit comments

Comments
 (0)